背包问题的算法
2006-07-18 12:47
232 查看
// BackPack.cpp : Defines the entry point for the console application. //背包问题处理头文件 //背包问题的算法 /* 作者:成晓旭 时间:2001年10月12日(18:02:38-18:12:00) 内容:完成背包问题的程序 时间:2001年10月9日(14:00:00-15:00:00) 内容:完成“皇后”问题的程序序言部分 =================================================== 问题描述: 在一个n*n的棋盘上放置n个不能互相捕捉的国际象棋“皇后”, 并输出所有合理的布局情况.(在国际象棋中,皇后可以沿着纵、横 及两条斜线共4个方向捕捉对手,可见,合适的解是在每行、每列及 在一条斜线上只能有一个皇后<皇后相互捕捉>) 编程思想: 算法描述: try(i,tw,tv) i: 物品编号 tw: 当前选择已达到的物品总重量和 tv: 本方案可能达到的物品总价值 { //考虑物品i包含在当前方案中的可能性 if(包含物品i是可接受的) { 将物品i包含在当前方案中(设置物品i为包含状态); if(i<n-1) try(i+1,tw+物品i的重量,tv); else //又一个完整方案,因为它比前面的方案好,以它作为最佳方案 以当前方案为最佳方案保存 恢复物品i不包含状态; } //考虑物品i不包含在当前方案中的可能性 if(不包含物品i仅是可考虑的) { if(i<n-1) try(i+1,tw,tv-物品i的价值); else //又一个完整方案,因为它比前面的方案好,以它作为最佳方案 以当前方案为最佳方案保存 } } */ #define N 100 int limitW, //限制的总重量 totalV, //全部物品的总价值 maxV; //所选方案的最大总价值 int option , //解的选择标志 curoption ; //当前解的选择标志 struct Goods //物品数据结构 { int weight; int value; }; Goods array ; int n; //物品种数 // 参数定义 // i: 物品编号 // tw: 当前选择已达到的物品总重量和 // tv: 本方案可能达到的物品总价值 void Find(int i,int tw,int tv) { int k; //考虑物品i包含在当前方案中的可能性 if(tw+array[i].weight <= limitW) {//包含物品i是可接受的 curoption[i] = 1; //将物品i包含在当前方案中(设置物品i为包含状态); if(i<n-1) Find(i+1,tw+array[i].weight,tv); else {//又一个完整方案,因为它比前面的方案好,以它作为最佳方案 for(k=0;k<n;k++) //将当前方案作为临时方案保存 option[k] = curoption[k]; maxV = tv; } curoption[i] = 0; //恢复物品i不包含状态 } //考虑物品i不包含在当前方案中的可能性 if(tv-array[i].value > maxV) { if(i<n-1) Find(i+1,tw,tv-array[i].value); else {//又一个完整方案,因为它比前面的方案好,以它作为最佳方案 for(k=0;k<n;k++) //将当前方案作为临时方案保存 option[k] = curoption[k]; maxV = tv-array[i].value; } } } void BackPack_Problem() { int k,w,v; printf("输入物品种数/n"); scanf("%d",&n); printf("输入各物品的重量及价值/n"); for(totalV = 0,k=0;k<n;k++) { scanf("%d%d",&w,&v); array[k].weight = w; array[k].value = v; totalV += v; } printf("输入限制的重量/n"); scanf("%d",&limitW); maxV = 0; for(k=0;k<n;k++) curoption[k] = 0; Find(0,0,totalV); for(k=0;k<n;k++) if(option[k]) printf("%4d",k+1); printf("总价值 = %d/n",maxV); printf("/n/n应用程序正在运行....../n"); }
相关文章推荐
- 【转】经典算法:背包问题
- 算法3:动态规划(二)——背包问题
- 算法2(動態規劃,背包问题,最長單調子序列,最長公共子序列
- 蓝桥杯 算法提高 拿糖果【变形的背包问题】
- 【算法问题】0-1背包问题
- 部分背包问题的贪心算法正确性证明
- 背包问题小结--持续更新 算法基础篇(七)
- 使用不同的算法求解0-1背包问题
- 经典算法题05-完全背包问题
- 0/1背包问题的分支定界法算法
- 算法0-1背包问题:
- JAVA代码—算法基础:0-1背包问题的回溯算法设计(续)
- 背包问题的算法
- 数据结构与算法学习之路:背包问题的贪心算法和动态规划算法
- 用贪心算法背包问题,Java实现
- 【算法】——动态规划之0-1背包问题
- 算法——背包问题 01背包+完全背包+多重背包
- 背包问题算法的JAVA实现
- 【算法导论】0-1背包问题 与 部分背包
- 算法笔记:动态规划背包问题(未完待续)