dp背包第四弹之分组背包~~
基本类型:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
解决思路:选取某组中某一件还是一件都不选。
伪代码:dp数组记录的是 前k组物品花费费用v能取得的最大权值。
for 所有的组k
for v=V..0
for 所有的i属于组k
dp[v]=max(dp[v],dp[v-c[i]]+w[i])
(第二个循环必须在第三个循环之外,这样才能保证每组物品最多只有一个被加入背包中);
题意就不说了,简单分组模板题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100000+10;
int dp[N];
int a[105][105];
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
if(n==0&&m==0) break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)//分组
{
for(int j=m;j>=0;j--)//V..0
{
for(int k=1;k<=m;k++)//组内每个物品遍历
{
if(j-k>=0)
dp[j]=max(dp[j],dp[j-k]+a[i][k]);
}
}
}
printf("%d\n",dp[m]);
}
return 0;
}