您的位置:首页 > 其它

hdu3732 多重背包+二进制优化

2016-03-20 02:42 288 查看
题意:n件物品,背包大小为C,每件物品有一定的价值和体积,求背包能装的最大价值。

思路:如果用01背包做肯定超时,因为数据给得太大了,我们可以根据价值和体积来区分物品,相当于背包空间和含有的价值 有多个,多重背包,然后用二进制优化,再用01背包来做;

代码:

#include<stdio.h>
#include<string.h>
#include<stdio.h>
#define max(x,y) (x>y?x:y)
int dp[10005];
int main()
{
int map[11][11];
int t,s;
while(~scanf("%d%d",&t,&s))
{
int i,j,k,l;
char c[10001];
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));
for(i=1;i<=t;i++)
{
scanf("%s%d%d",c,&j,&k);
getchar();
map[j][k]+=1;
}
for(i=1;i<=10;i++)
{
for(j=1;j<=10;j++)
{
int tt=1,zz=map[i][j];
while(tt<zz)
{
for(k=s;k>=tt*j;k--)
dp[k]=max(dp[k],dp[k-tt*j]+tt*i);
zz-=tt;
tt*=2;
}
for(k=s;k>=zz*j;k--)
dp[k]=max(dp[k],dp[k-zz*j]+zz*i);
}
}
printf("%d\n",dp[s]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: