题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
代码:
#include <iostream>
#include<stdio.h>
#include<memory.h>
using namespace std;
#define MAXN 1001
#define Max(a,b) a>b?a:b
struct Node
{
int volume;
int value;
};
Node node[MAXN];
int main()
{
int T,n,m,i,j;
int f[MAXN];
while(scanf("%d",&T),T)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&node[i].value);
for(i=1;i<=n;i++)
scanf("%d",&node[i].volume);
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
for(j=m;j>=node[i].volume;j--)
{
f[j]=Max(f[j],f[j-node[i].volume]+node[i].value);
}
printf("%d\n",f[m]);
T--;
}
return 0;
}
总结模板:
1: 0-1背包:n件物品放入容量为v的背包,每件物品只有一件,只可以选择放或是不放,求最大价值
void zeroonepack(int cost,int value)
{
int i;
for(i=sum;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost]+value);
}
2: 完全背包:n件物品放入容量为v的背包,每种物品有无限件,求最大价值 算法模板:
void completepack(int cost,int value)
{
int i;
for(i=cost;i<=sum;i++)
dp[i]=max(dp[i],dp[i-cost]+value);
}
3:多重背包n件物品放入容量为v的背包,每件物品的件数都是有上限的,求最大价值
void multiplepack(int cost,int value,int amount)
{
int k=1;
if(cost*amount>=sum)
completepack(cost,value);
else
{
while(k<amount)
{
zeroonepack(k*cost,k*value);
amount-=k;
k*=2;
}
zeroonepack(amount*cost,amount*value);
}
}