oj2335——0-1背包问题
来源:互联网 发布:企业it解决方案 编辑:程序博客网 时间:2024/06/02 02:13
问题描述:0-1背包问题
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。
0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是wi ,其价值为vi ,背包的容量为C。应如何选择装入背包的物品,使得装
入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能将物品i 装入背包多次,
也不能只装入部分的物品i。
作者:何知令
完成时间:2017年5月18日
输入;
第一行有2个正整数n和c。n是物品数,c是背包的容量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的重量。
输出:
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。
0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是wi ,其价值为vi ,背包的容量为C。应如何选择装入背包的物品,使得装
入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能将物品i 装入背包多次,
也不能只装入部分的物品i。
作者:何知令
完成时间:2017年5月18日
输入;
第一行有2个正整数n和c。n是物品数,c是背包的容量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的重量。
输出:
将计算出的装入背包物品的最大价值和最优装入方案输出。第一行输出为:Optimal value is
解题思想:使用贪心思想,不断寻找性价比最高的物品将其装进包里,当物品中的最小质量大于包的剩余质量时结束循环;
代码:
/*问题描述:0-1背包问题试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。 0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是wi ,其价值为vi ,背包的容量为C。应如何选择装入背包的物品,使得装 入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能将物品i 装入背包多次, 也不能只装入部分的物品i。作者:何知令完成时间:2017年5月18日输入;第一行有2个正整数n和c。n是物品数,c是背包的容量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的重量。输出:将计算出的装入背包物品的最大价值和最优装入方案输出。第一行输出为:Optimal value is*/#include <stdio.h>#include <stdlib.h>int findMax(float value[],int state[],int n)//查找未拿进包中的物品中性价比最高的物品{ float max_value; int i,place; max_value=0; for(i=0; i<n; i++) { if(max_value<value[i]&&state[i]==0)//若其状态为1,表示该物品没被拿进包中,可以选择拿进包中 { max_value=value[i]; place=i; } } state[place]=1;//拿进包中,将其状态置为1 return place;}int main(){ int n; int i; int left_weight,minWeight,Optimal_value=0;//包剩于容量,物品中质量最小的物品的重量 float money[100],weight[100],value[100];//物品价值,质量,性价比 int state[100]= {0}; scanf("%d %d",&n,&left_weight); for(i=0; i<n; i++) scanf("%f",&money[i]); for(i=0; i<n; i++) scanf("%f",&weight[i]); for(i=0; i<n; i++) value[i]=money[i]/weight[i]; minWeight=weight[0]; for(i=1; i<n; i++) { if(minWeight>weight[i]) minWeight=weight[i]; } while(left_weight>minWeight)//使用贪心思想,不断寻找性价比最高的物品将其装进包里,当物品中的最小质量大于包的剩余质量时结束循环。 { i=findMax(value,state,n); left_weight-=weight[i]; } for(i=0;i<n;i++) { if(state[i]==1) Optimal_value+=money[i]; } printf("Optimal value is\n%d\n",Optimal_value); for(i=0; i<n; i++) printf("%d ",state[i]); return 0;}程序运行结果展示:
知识点总结:贪心思想
学习心得:贪心算法有些情况不能解决一些问题,最标准解法为动态规划。
阅读全文
0 0
- oj2335——0-1背包问题
- 背包问题——0-1背包
- 0—1背包问题
- 背包问题(1)——01背包、完全背包、多重背包、混合三种背包问题
- 背包问题总结第二讲——0-1背包
- 背包九讲——0-1背包问题
- 回溯——0/1背包问题
- 回溯——0-1背包问题
- 动态规划0—1背包问题
- 0—1背包问题(dp)
- 动态规划0—1背包问题
- 动态规划0—1背包问题
- 0—1背包问题,回溯实现
- 动态规划0—1背包问题
- 动态规划0—1背包问题
- 动态规划0—1背包问题
- 动态规划0—1背包问题
- 动态规划—0-1背包问题
- 请求路径的参数出现的问题
- string和char*
- Python3.6 psutil官方开发文档
- Android 打包、资源合并问题 "Manifest merger failed with multiple errors" and "Could not expand ZIP"
- 在python中安装Numpy、MatPlotLib、SciPy
- oj2335——0-1背包问题
- 算法提高 数字黑洞
- 使用DPM训练自己的模型
- Js高级函数式编程
- oracle时间函数(二),trunc()
- 最佳乘法问题
- android实现倒计时,最简单实现RecyclerView倒计时+SwipeRefreshLayout下拉刷新
- Spring异常默认映射HTTP状态码
- 约束优化方法之拉格朗日乘子法与KKT条件