分组背包

有 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]);

    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容