回溯法解决0-1背包问题
2015-05-30 21:17
274 查看
1004.0-1背包问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
输入
多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。
输出
每个测例的输出占一行,输出一个整数,即最佳装载的总价值。
输入样例
1 2
1
1
2 3
2 2
3 4
0 0
输出样例
1
4
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
输入
多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。
输出
每个测例的输出占一行,输出一个整数,即最佳装载的总价值。
输入样例
1 2
1
1
2 3
2 2
3 4
0 0
输出样例
1
4
#include <iostream> using namespace std; int c; //容量 int n;//n个物品 int w[11] = { 0 }; //重量数组 int p[11] = { 0 };//价值数组 int bestValue = 0; //最佳转载 int currentValue = 0, currentW = 0; void backTack(int i); void init(); int main() { while (cin >> n >> c) { if (n == 0 && c == 0) { break; } for (int i = 1; i <= n; i++) { cin >> w[i]; } for (int i = 1; i <= n; i++) { cin >> p[i]; } backTack(1); cout << bestValue << endl; init(); } } void init() { bestValue = 0; //最佳转载 currentValue = 0; currentW = 0; } void backTack(int i) { if (i > n) { if (currentValue >= bestValue) { bestValue = currentValue; } } else { if (currentW + w[i] <= c) { //剪枝条件 currentW += w[i]; currentValue += p[i]; backTack(i + 1); currentValue -= p[i]; currentW -= w[i]; } //因为currentW + 0 = currentW; currentValue + = currentValue backTack(i + 1); } }
相关文章推荐
- C语言及程序设计进阶例程-14 开发一个电子词典
- 线段树
- 侧导航运动
- 余晟:让自家系统瘫痪,这事我也干过
- Websphere8.5安装与配置
- C语言及程序设计进阶例程-13 结构体数组及其应用
- linux socket 编程(C语言)
- HTTP语言
- Swing 实现截图小软件
- uCos II 就绪列表
- C语言及程序设计进阶例程-12 结构体成员的引用
- boost的库中bind和function使用实例
- GitTorrent:去中心化的GitHub
- 给自己的未来多一种可能
- Redis 怎么设置集群
- 【转自黄炜】Oracle SQL提示含义与示例 --- 语句运行和数据操作提示
- 设计模式——迭代器模式
- 日志_log 4000 4j 总结
- 15省赛总结
- testNG参数传递方式