有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 Ci,价值是 Wi。这些
物品被划分为 K 组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包
可使这些物品的费用总和不超过背包容量,且价值总和最大。
使用一维数组的伪代码如下:
for k ← 1 to K
for v ← V to 0
for all item i in group k
F[v] ← max{F[v], F[v − Ci] + Wi}
http://acm.hdu.edu.cn/showproblem.php?pid=1712
#include <cstdio>
#include<algorithm>
#include<string.h>
#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
using namespace std;
int main()
{
int n,m;
int dp[105];
int arr[100][100];
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0) break;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(int g=1;g<=n;g++)
{
for(int j=m;j>=0;j--)
{
for(int k=1;k<=m;k++)
{
if(j-k>=0)
{
dp[j]=Max(dp[j],dp[j-k]+arr[g][k]);//第g组第k个物品花费为k
}
}
}
}
printf("%d\n",dp[m]);
}
}