HDU 2955 Robberies by Assassin

这个题目有毒。。一开始就注意到了需要统计A、B、C三个的数值,但是他说单个物品不超过600实在是误导。。。
这是一个dp,转换方程
dp[j]=max(dp[j-(int)(100*value[i])]+value[i],dp[j])
其中value是统计的合法报销的帐目、dp[i]表示价格*100(因为精确到两位,所以乘以100)可以得到的最大报的账目。简单的背包问题。

#include<bits/stdc++.h>
#define input freopen("input.txt","r",stdin)
using namespace std;
float sum;
float dp[3000010];
float check[3],value[40];
int main()
{
    input; 
    int n,i,j,m,flag,pos;
    char c;
    float key;
    while(cin>>sum>>n)
    {
        if(n==0)
            break;
        for(pos=1,i=1;i<=n;i++)
        {
            memset(check,0,sizeof(check));
            flag=1;
            scanf("%d",&m);
            for(j=1;j<=m;j++)
            {
                getchar();
                c=getchar();
                getchar();
                cin>>key;
                if(c!='A'&&c!='B'&&c!='C')
                {
                    flag=0;
                }
                check[c-'A']+=key;
                if(check[c-'A']>600)
                {
                    flag=0;
                }
                if(check[0]+check[1]+check[2]>1000)
                {
                    flag=0;
                }
            }
            if(flag)
            {
                value[pos++]=check[0]+check[1]+check[2];
            }
        }
        memset(dp,0,sizeof(dp));
        for(i=1;i<pos;i++)
        {
            for(j=(int)(sum*100);j>=(int)(100*value[i]);j--)
            {
                dp[j]=max(dp[j-(int)(100*value[i])]+value[i],dp[j]);
            }
        }
        printf("%.2lf\n",dp[(int)(sum*100)]);
    }
    return 0;
}

代码不好,欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值