HDU 3732 多重揹包

 這道題目意思很簡單就是:輸入 N 和 C ,N是代表N行,而C是複雜性,輸入一些單詞,然後告訴這些單詞的價值,還有這些單詞的複雜性!
 一開始我一看這個題目就以爲是01揹包,然後就馬上寫完,第一組測試數據過了,但是卻WA!後來看別人的博客,發現用多重揹包,就想想,
後來想通了,首先用01揹包做第一組數據之所以能過,是因爲第一組數據沒有給出重複的單詞,如果給出重複的單詞就會出現數目的問題,就不
能用01揹包,而且數量還是有限的,所以就用多重揹包!!1這題純粹就是一個假的01揹包!!!我感覺這道題目蠻好的!!!

代碼如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100005;
int value[maxn],cost[maxn],num[12][12];
int f[maxn];
char s[15];
int n,c;




void zeropack(int value1, int cost1)
{
    for(int i=c; i>=cost1; i--)
    {
        f[i]=max(f[i],f[i-cost1]+value1);
    }
}




void completpack(int value1,int cost1)
{
    for(int i=cost1; i<=c; i++)
    {
        f[i]=max(f[i],f[i-cost1]+value1);
    }
}


void multiplepack(int value1,int cost1,int num1)
{
    if(cost1*num1>=c)
    {
        completpack(value1,cost1);
        return;
    }
    else
    {
        int k=1;
        while(k<num1)
        {
            zeropack(k*value1,k*cost1);
            num1=num1-k;
            k=k*2;
        }
        zeropack(num1*value1,num1*cost1);
    }
}


int main()
{
    int i,j;
    while(scanf("%d%d",&n,&c)!=EOF)
    {
        memset(value,0,sizeof(value));
        memset(cost,0,sizeof(cost));
        memset(num,0,sizeof(num));
        getchar();
        for(i=0; i<n; i++)
        {
            scanf("%s%d%d",s,&value[i],&cost[i]);
            num[value[i]][cost[i]]++;
        }


        memset(f,0,sizeof(f));
        for(i=0; i<=10; i++)
        {
            for(j=0; j<=10; j++)
            {
                if(num[i][j])
                {
                    multiplepack(i,j,num[i][j]);
                }
            }
        }
        printf("%d\n",f[c]);
    }
    return 0;
}


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