這道題目意思很簡單就是:輸入 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;
}
HDU 3732 多重揹包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.