赞
踩
用回溯法解决0-1背包问题时,其解空间有长度为n的0-1向量组成,并可以组织成高度为n+1满二叉树。二叉树的结点按层次遍历的顺序从上到下、从左到右的顺序编号(从1开始)。
采用回溯法解决问题时,可以使用约束条件对左子树进行剪枝,使用限界条件对右子树进行剪枝。
在本题中,约束条件为tw+w[i]<=C,限界条件为tv+rv[i]>maxv
有多组数据。
每组数据包含三行。
第一行包含两个整数C(1 <= C <= 10000)和n(1 <= n <= 20),分别表示背包的容量和物品的个数。
第二行包含n个整数,依次表示第i个物品的重量w(0 <= w[i] <= 100)。
第三行包含n个整数,依次表示第i个物品的价值v(0 <= v[i] <= 100)。
对于每组输入数据
程序先依次输出扩展结点的编号、访问该结点时背包中物品的重量tw及背包中物品的价值tv,每个结点一行;
然后输出最优值maxv和最有解x(0/1向量)并换行。
解向量x的每个元素后一个空格,其他数据以空格分隔。
输入 | 输出 |
---|---|
5 3 | 1 0 0 |
4 3 2 | 2 4 5 |
5 2 1 | 5 4 5 |
11 4 5 | |
5 1 0 0 |
输入 | 输出 |
---|---|
5 3 | 1 0 0 |
5 3 2 | 2 5 4 |
4 4 3 | 5 5 4 |
11 5 4 | |
3 0 0 | |
6 3 4 | |
12 5 7 | |
7 0 1 1 |
#include <iostream>
#include <stdio.h>
#define MAXN 20
using namespace std;
// 背包容量C(1<= C <=10000),物品数量n(1<=n<=20)
int C = 0, n = 0;
// 物品重量w,物品价值v
int w[MAXN] = {
0};
int v[MAXN]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。