Advertisement

CH 5201 数字组合问题(算法竞赛指南, 01背包)

阅读量:

算法竞赛进阶指南,277页,01背包

本题关键点:
1、对01背包的代码进行适当调整即可。通常情况下,01背包问题描述如下:
设有n个物品,每个物品的体积为v[i],对应的价值为w[i],目标是将这些物品装入容量为m的背包中,使得获得的价值最大。
其中f[j]表示容量为j的背包所能承载的最大价值。其状态转移方程为:
f[j] = max(f[j], f[j - v[i]] + w[i]);
2、题目含义转换:
设有n个物品,每个物品的体积为v[i],对应的价值为1,目标是将这些物品装入容量为m的背包中,并统计所有可能的装法数量。
此时f[j]表示容量为j的背包所能实现的不同装法总数。其状态转移方程可表示为:
f[j] = f[j] + f[j - v[i]]; // 不选择第i个物品与选择第i个物品的情况

复制代码
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    const int MaxN = 10010;	
    int v[MaxN], w[MaxN];	//体积重量
    int f[MaxN];	//f[i] 和为i有多少种方案
    int a[MaxN];
    int n, 

全部评论 (0)

还没有任何评论哟~