C - 最大报销额 HDU - 1864

//01背包公式

f[j] = max{ f[j] , f[j-w(i)+v(i) }

上面的代码就改下了下面这样:

#include<iostream>  
using namespace std;  
#define  V 1500  
unsigned int f[V];//全局变量,自动初始化为0  
unsigned int weight[10];  
unsigned int value[10];  
#define  max(x,y)   (x)>(y)?(x):(y)  
int main()  
{  
      
    int N,M;  
    cin>>N;//物品个数  
    cin>>M;//背包容量  
    for (int i=1;i<=N; i++)  
    {  
        cin>>weight[i]>>value[i];  
    }  
    for (int i=1; i<=N; i++)  
        for (int j=M; j>=1; j--)  
        {  
            if (weight[i]<=j)  
            {  
                f[j]=max(f[j],f[j-weight[i]]+value[i]);  
            }             
        }  
      
    cout<<f[M]<<endl;//输出最优解  
  

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
//这是一个01背包问题,而且是有小数的,所以乘100,最后再除100
int coun[40];
const int maxn=30*100000+10;
int f[maxn];
double Q;
int main()
{
    int N;
    int m;
    char ch;
    int A,B,C;
    double price;
    int price1;
    while(~scanf("%lf%d",&Q,&N)&&N)
    {
        memset(coun,0,sizeof(coun));
        memset(f,0,sizeof(f));
        int Q1=(int)(Q*100);
        int sizen=1;
        for(int i=1; i<=N; i++)
        {
            int ok=1;
            A=B=C=0;
            price1=0;
            scanf("%d",&m);
            for(int j=0; j<m; j++)
            {
                getchar();
                scanf("%c:%lf",&ch,&price);
                int price2=(int)(price*100);
                if(ch=='A')
                    A+=price2;
                else if(ch=='B')
                    B+=price2;
                else if(ch=='C')
                    C+=price2;
                else
                    ok=0;
                price1+=price2;
            }
            if(A<=60000&&B<=60000&&C<=60000&&price1<=100000&&ok)
                coun[sizen++]=price1;
        }
        for(int i=1; i<sizen; i++)
            for(int j=Q1; j>=1; j--)
            {
                if(j>=coun[i])
                    f[j]=max(f[j],f[j-coun[i]]+coun[i]);
            }
        printf("%.2lf\n",f[Q1]*1.0/100.00);

    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/zhangzhenjunaixuxin/article/details/81453479