HDU 1864 01揹包

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=5000005;
int f[maxn];
int num[50];
double q;
int t;


int main()
{
    int i,j,n,m;
    double x;
    int ta,tb,tc,r;
    char c;
    while(scanf("%lf%d",&q,&n),n)
    {
        int k=0;
        while(n--)
        {
            ta=0,tb=0,tc=0;
            scanf("%d",&m);
            int flag=0;
            while(m--)
            {


                scanf(" %c:%lf",&c,&x);//這裏前面有一個空格輸入,要記得,還可以這樣輸入scanf("%*c%c:%lf",&c,&x);
                x*=100;
                r=(int)x;//轉換成整型
                if(flag==0)
                {
                    if(c=='A'||c=='B'||c=='C')//保證 類型是在 A B C 三種類型中
                    {
                        if(c=='A')
                        {
                            if((ta+r)<=60000)//單項物品的價值不得超過600元
                                ta+=r;
                            else
                                flag=1;//如果有一項超過了的話,那麼這張發票就沒有用,不能報銷
                        }
                        if(c=='B')
                        {
                            if((tb+r)<=60000)
                            {
                                tb+=r;
                            }
                            else
                                flag=1;
                        }
                        if(c=='C')
                        {
                            if((tc+r)<=60000)
                            {
                                tc+=r;
                            }
                            else
                            {
                                flag=1;
                            }
                        }
                    }
                    else
                        flag=1;//如果有一種類型不是這三種中一種的話,那麼這張發票也是沒有用的
                }


            }
            if(flag==0&&(ta+tb+tc)<=100000)//還有就是要求每張發票的總額不得超過1000元,不然這張發票也是沒有用
            {
                num[k++]=(ta+tb+tc);
            }
        }
        q*=100;
        t=(int)q;


        memset(f,0,sizeof(f));
        for(i=0; i<k; i++)//這裏就是01揹包
        {
            for(j=t; j>=num[i]; j--)
            {
                f[j]=max(f[j],f[j-num[i]]+num[i]);
            }
        }
        printf("%.2lf\n",f[t]/100.0);//這裏我範了一下混吧,就是直接寫成100沒有寫成100.0
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章