原文链接: HDU2161
上一篇: HDU1003 Max Sum
下一篇: 01背包方案数
多重背包,转化为01背包
#include <iostream>
#include <cstdio>
using namespace std;
#define MAX 111111
int dp[MAX];
int price[MAX],hight[MAX],cnt[MAX]; //价格,重量,数目
int c[MAX],w[MAX]; //新物品的价值,重量
int main(int argc, char *argv[])
{
int T;
scanf("%d",&T);
while(T--){
int money,m;
scanf("%d%d",&money,&m);
int num=1; //新物品由数组下标为1 处开始放置
for(int i=1;i<=m;i++){
scanf("%d",price+i);
scanf("%d",hight+i);
scanf("%d",cnt+i);
//转化物品
for(int j=1;j<=cnt[i];j<<=1){
c[num] = j*price[i];
w[num++] = j*hight[i];
cnt[i]-=j;
}
if(cnt[i]>0){
c[num]=cnt[i]*price[i];
w[num++] = cnt[i]*hight[i];
}
}
//01背包
memset(dp,0,sizeof(dp));
//注意此时num是比背包中的数目大一的
for(int i=1;i<num;i++){
for(int j=money;j>=c[i];j--){
dp[j]=max(dp[j],dp[j-c[i]]+w[i]);
}
}
printf("%d\n",dp[money]);
}
return 0;
}