题目链接 http://www.rqnoj.cn/Problem_6.html 详细分析引自DD《背包九讲》 分组背包问题
for v=V..0 for 所有的i属于组k
NOIP2006的那道背包问题我做得很失败,写了上百行的代码,却一分未得。后来我通过思考发现通过引入“物品组”和“依赖”的概念可以加深对这题的理解,还可以解决它的推广问题。用物品组的思想考虑那题中极其特殊的依赖关系:物品不能既作主件又作附件,每个主件最多有两个附件,可以发现一个主件和它的两个附件等价于一个由四个物品组成的物品组,这便揭示了问题的某种本质。
#include #include #define MAX_money 32000 #define MAX 60 using namespace std; int f[MAX_money]; int v[MAX], p[MAX], q[MAX]; struct T { int num; int V[5], W[5]; // 每一组组背包里的五种状态 }T[60]; int main() { int n, m, count = 0; while(scanf("%d%d", &n, &m) != EOF) { memset(f, 0, sizeof(f)); for(int i = 0; i = 0; k--) { for(int j = 1; j <= T[i].num; j++) { if(k >= T[i].V[j]) { f[k] = max(f[k], f[k - T[i].V[j]] + T[i].W[j]); } } } } } printf("%d\n", f[n]); } }