1. 程式人生 > >HDU 1864最大報銷額 01揹包

HDU 1864最大報銷額 01揹包

我看到網上好多都是將物品的價值,揹包容量擴大一百倍全部轉化為int再最後輸出時轉化為double輸出,所以我想可不可以直接用總支票數作為揹包容量,顯然是可以的。

每一張支票的重量為1,權值即是報銷額度,可以通過計算,直接篩除不符合條件的支票;

由於有一個最大的總報銷額,所以1.   dp[j-1]+val[i]<=Q(最大報銷額),則 dp[j]=max(dp[j],dp[j-1]+val[i]);

                                                      2.   否則,dp[j]=dp[j];

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const double epos=1e-8;
const int maxn=39;
double dp[maxn];
double vall[39];

bool cmp(const double& x,const double& y){return x>y;}
int main(){
    double Q,val;
    int n;
    char c,d;
    int m;
    while(scanf("%lf%d",&Q,&n)!=EOF&&n){
        memset(dp,0,sizeof(dp));
        int t=0;
        for(int i=0;i<n;i++){
            scanf("%d",&m);
            int flag=1;
            double aa=0,bb=0,cc=0;
            while(m--){
                getchar();
                scanf("%c%c%lf",&c,&d,&val);
                if(c=='A')
                    aa+=val;
                else if(c=='B')
                    bb+=val;
                else if(c=='C')
                    cc+=val;
                else
                    flag=0;
            }
            //將不符合要求的支票刪掉;
            if(flag==1&&aa<=600&&bb<=600&&cc<=600&&(aa+bb+cc)<=1000&&(aa+bb+cc)<=Q)
                vall[t++]=aa+bb+cc;

        }
        for(int i=0;i<t;i++)
            for(int j=t;j>=1;j--)
                if(dp[j-1]+vall[i]<=Q)
                    dp[j]=max(dp[j],dp[j-1]+vall[i]);
                else
                    dp[j]=dp[j];
        //printf("%.2lf\n",dp[t]);
        sort(dp+1,dp+1+t,cmp);
        printf("%.2lf\n",dp[1]);

    }
    return 0;
}