回溯法解决01背包问题
2018-01-16 16:01
363 查看
一、问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
二、总体思路:因为回溯求解的规则是“后进先出”,所以要用栈来存放符合条件的解,在存储过程中用数组来存放各个物品的体积和价值,然后用深度优先搜索的方式求解,最后得到符合条件的最优解并输出。
三、c语言代码如下:
四、运行结果如下:
五、分析
回溯法的重点是在于搞清楚界限函数和什么时候递归,以及回溯的具体时间和位置,搞清楚了这些之后代码的编写还是很简单的,主要是要搞清楚回溯法的原理和思想。
二、总体思路:因为回溯求解的规则是“后进先出”,所以要用栈来存放符合条件的解,在存储过程中用数组来存放各个物品的体积和价值,然后用深度优先搜索的方式求解,最后得到符合条件的最优解并输出。
三、c语言代码如下:
#include<stdio.h> int bc,n; //bc为背包容量,n为商品数量 int w[10],v[10]; //w数组存放对应商品的重量,v数组存放对应商品的价值 int cbv; //当前最优价值 int bv; //最优价值 int cw; //点前重量 int ba[10]; //最优解商品的取法 int cba[10]; //当前最优解商品的取法 void Backtracking(int i); int main() { int i; printf("请输入商品总数:\n"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("请输入第%d件商品的重量和价值\n",i); scanf("%d%d",&w[i],&v[i]); } printf("请输入背包的总容量:\n"); scanf("%d",&bc); //初始化 cbv=0; bv=0; cw=0; for(i=1;i<=n;i++) { ba[i]=0; cba[i]=0; } //输出商品价值重量表格 printf("商品对应的重量与价值:\n "); for(i=1;i<=n;i++) printf("%d ",i); printf("\n"); printf("重量: "); for(i=1;i<=n;i++) printf("%d ",w[i]); printf("\n"); printf("价值: "); for(i=1;i<=n;i++) printf("%d ",v[i]); printf("\n"); //寻找最优解 Backtracking(1); //输出最优解 printf("**************************************\n"); for(i=1;i<=n;i++) { if(ba[i]==1) printf("取第%d件商品\n",i); } printf("最优解为%d\n",bv); } void Backtracking(int i) { if(i>n) { if(cbv>=bv) { bv=cbv; for(int j=1;j<=n;j++) ba[j]=cba[j]; } return; } if(w[i]+cw<=bc) { //装入背包 cba[i]=1; cw+=w[i]; cbv+=v[i]; Backtracking(i+1); cw-=w[i]; cbv-=v[i]; } cba[i]=0; //回溯前清理现场 Backtracking(i+1); }
四、运行结果如下:
五、分析
回溯法的重点是在于搞清楚界限函数和什么时候递归,以及回溯的具体时间和位置,搞清楚了这些之后代码的编写还是很简单的,主要是要搞清楚回溯法的原理和思想。
相关文章推荐
- Python基于回溯法解决01背包问题实例
- 回溯法解决01背包问题
- 回溯法解决01背包问题
- 用试探回溯法解决N皇后问题
- 回溯法解决N皇后问题(以四皇后为例)
- 回溯法解决喝酒问题
- 回溯法解决N皇后问题
- 八皇后问题——回溯法解决
- 01背包问题(DP解决)
- 回溯法解决N皇后问题(以四皇后为例)
- 利用回溯法解决1-9之间添加"+"或"-"或""使得运算结果为100的问题
- 回溯法解决最小机器重量问题
- JAVA使用回溯法解决n皇后问题的算法
- DFS解决01背包问题
- 回溯法解决迷宫问题(方法1---递归)
- 回溯法解决组合与数的问题(递归与非递归算法)
- 【回溯法】--01背包问题
- 用回溯法(backtracking)解决平衡集合问题(一道微软公司面试题)
- PHP回溯法解决0-1背包问题实例分析
- scala 回溯法解决八皇后问题