《动态规划》hdoj 1864 01背包

dp[j]记录报销j张发票 所能支付的最大钱数    for(j=i;j>=1;j--)倒置是为了防止重复加入 字符串处理恶心 别忘了可能有多个同种类型的情况

#include<stdio.h>

int main()
{
    double dp[35],money[35];
    int i,j,ans,n,len,m,flag;
    double q,a,b,c,sum,price;
    char name;
    while(scanf("%lf%d",&q,&n)&&n!=0)
    {
        memset(dp,0,sizeof(dp));
        len=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&m);
            a=b=c=0;
            flag=1;
            for(j=1;j<=m;j++)
            {
                scanf(" %c:%lf",&name,&price);
                if(name=='A') a+=price;
                else if(name=='B') b+=price;
                else if(name=='C') c+=price;
                else flag=0;
            }
            sum=a+b+c;
            if((a>600)||(b>600)||(c>600)||(sum>1000))
                flag=0;
            if(flag) money[len++]=sum;
        }
        for(i=1;i<len;i++)
        {
            for(j=i;j>=1;j--)
            {
                if((dp[j-1]+money[i]<=q)&&(dp[j-1]+money[i]>dp[j]))
                    dp[j]=dp[j-1]+money[i];
            }
        }
        ans=0;
        dp[0]=0;
        for(i=1;i<len;i++)
            if(dp[i]>dp[ans])
                ans=i;
        printf("%.2lf\n",dp[ans]);
    }
}

你可能感兴趣的:(《动态规划》hdoj 1864 01背包)