oj2335——0-1背包问题
2017-05-18 11:42
211 查看
问题描述: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
解题思想:使用贪心思想,不断寻找性价比最高的物品将其装进包里,当物品中的最小质量大于包的剩余质量时结束循环;
代码:
知识点总结:贪心思想
学习心得:贪心算法有些情况不能解决一些问题,最标准解法为动态规划。
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解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; }程序运行结果展示:
知识点总结:贪心思想
学习心得:贪心算法有些情况不能解决一些问题,最标准解法为动态规划。
相关文章推荐
- 九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)
- 九度OJ 1532 棋盘寻宝扩展 -- 动态规划【背包问题】
- 杭电OJ 1248 完全背包问题 及反思
- CSUOJ 1945 最简单的题目 背包问题
- 01 背包问题 cafeteria HPUOJ
- 南阳理工学院OJ_106_背包问题
- 交大OJ 3021 有限背包(背包问题
- <OJ_Sicily>Coins完全背包问题
- YTU 2335: 0-1背包问题
- xynuoj 可分割背包问题 酒馆浪人的博客
- 贪心法 南阳oj 背包问题
- 南阳oj106 背包问题
- 南阳OJ 背包问题
- YOJ 2335-0-1背包问题(输出最优装入方案)
- 九度OJ 1152:点菜问题 (01背包、DP)
- 九度OJ 1532 棋盘寻宝扩展 -- 动态规划【背包问题】
- ytu 2335: 0-1背包问题
- 南邮 OJ 1308 背包问题
- 华为oj上的购物单问题,背包问题的变种,动态规划
- 交大OJ 1272 写数游戏/背包问题