0-1背包问题:
时限:1000ms 内存限制:10000K 总时限:3000ms
问题描述:
需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
输入:
多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。
输出:
每个测例的输出占一行,输出一个整数,即最佳装载的总价值。
输入示例
输出示例
基本思路
设n个物品,重量用数组w[1…n]存放,价值用v[1…n]存放,容量为c,用best[1…n]表示最优解,best[i]=0表示不放入背包,best[i]=1表示放入背包。由于每个物品要么装入,要么不装入,其解空间是一颗子集树,每个结点中有两个数值,前者表示放入背包中物品的总重量,后者表示总价值。
具体过程
见代码注释,因为之前写代码不太习惯写注释,所以每次在着手代码前会先描述下思路,忽然觉得这样不利于之后代码的复习,还是将过程具体到代码当中去了。
代码实现
#include <iostream>
using namespace std;
int n,c;//物品总数,背包容量
int w[100];//各物品重量
int v[100];//各物品价值
int c_w;//当前总质量
int c_v;//当前总价值
int best_v;//最优的价值
void dfs(int k);//回溯深搜
bool cut(int k);//剪枝
bool overweight(int k);
int main()
{
scanf("%d %d",&n,&c);
while(!(n==0&&