C语言实现--背包问题 算法(Knapsack Problem)
问题引入
假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得的相应总价物
品,假设物品是水果,水果的编号、单价与重量如下所示:
序号 | 水果类型 | 重量 /kg | 金额 /元 |
---|---|---|---|
1 |
李子 |
4 | 4500 |
2 |
苹果 |
5 | 5700 |
3 |
橘子 |
2 | 2250 |
4 |
草莓 |
1 | 1100 |
5 |
甜瓜 |
6 | 6700 |
请实现“如何最佳的选择物品”实现背包负重允许下装更多的物品?
问题分析
背包问题是关于最佳化的问题,要解最佳化问题可以使用「动态规划」(Dynamic programming),从空集合开始,每增加一个元素就先求出该阶段的最佳解,直到所有的元素加 入至集合中,最后得到的就是最佳解。
以背包问题为例,我们使用两个阵列value与item,value表示目前的最佳解所得之总价,item表 示最后一个放至背包的水果,假设有负重量 1~8的背包8个,并对每个背包求其最佳解。
逐步将水果放入背包中,并求该阶段的最佳解:
放入李子 |
背包 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
负重 |
|||||||||
value |
0 |
0 |
0 |
450 |
450 |
450 |
450 |
900 |
|
item |
- |
- |
- |
0 |
0 |
0 |
0 |
0 |
|
放入苹果 |
背包 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
负重 |
|||||||||
value |
0 |
0 |
0 |
450 |
570 |
570 |
570 |
900 |
|
item |
- |
- |
- |
0 |
1 |
1 |
1 |
0 |
|
放入橘子 |
背包 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
负重 |
|||||||||
value |
0 |
225 |
225 |
450 |
570 |
675 |
795 |
900 |
|
item |
- |
2 |
2 |
0 |
1 |
2 |
2 |
0 |
放入草莓 |
背包 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
负重 |
|||||||||
value |
110 |
225 |
335 |
450 |
570 |
680 |
795 |
905 |
|
item |
3 |
2 |
3 |
0 |
1 |
3 |
2 |
3 |
|
放入甜瓜 |
背包 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
负重 |
|||||||||
value |
110 |
225 |
335 |
450 |
570 |
680 |
795 |
905 |
|
item |
3 |
2 |
3 |
0 |
1 |
3 |
2 |
3 |
由最后一个表格,可以得知在背包负重8公斤时,最多可以装入9050元的水果,而最后一个装入 的 水果是3号,也就是草莓,装入了草莓,背包只能再放入7公斤(8-1)的水果,所以必须看 背包负重7公斤时的最佳解,最后一个放入的是2号,也就 是橘子,现在背包剩下负重量5公斤(7-2),所 以看负重5公斤的最佳解,最后放入的是1号,也就是苹果,此时背包负重量剩下0公 斤(5-5), 无 法 再放入水果,所以求出最佳解为放入草莓、橘子与苹果,而总价为9050元。
代码实现
说明:采用C语言,编译环境为DevC++。
#include <stdio.h>
#include <stdlib.h>
#define LIMIT 8//重量限制
#define N 5 //物品种类
#define MIN 1 //最小重量struct body {char name[20]; int size;int price;
};
typedef struct body object;int main() {int item[LIMIT+1] = {0}; int value[LIMIT+1] = {0}; int newvalue, i, s, p;object a[] = {{"李子", 4, 4500},{"苹果", 5, 5700},{"橘子", 2, 2250},{"草莓", 1, 1100},{"甜瓜", 6, 6700}};for(i = 0; i < N; i++){for(s = a[i].size; s <= LIMIT; s++){ p = s - a[i].size;newvalue = value[p] + a[i].price;if(newvalue > value[s]){ // 找到阶段最佳解value[s] = newvalue; item[s] = i;}}}printf("物品\t价格\n");for(i = LIMIT; i >= MIN; i = i - a[item[i]].size){ printf("%s\t%d\n",a[item[i]].name, a[item[i]].price);}printf("合计\t%d\n", value[LIMIT]);return 0;
}
运行结果
写在最后:
读两遍下来,如果仍然有不清楚的地方,可在评论区留言。
如果你有其他感到困惑的问题,欢迎留言。
C语言实现--背包问题 算法(Knapsack Problem)相关推荐
- C#,背包问题(Knapsack Problem)贪心算法的源代码
背包问题(KnapSack Problem)的相关算法是常用的规划算法. 一.什么是背包问题? 背包的问题是,你有一个"袋子",可以装有限数量的物品,鉴于你有一组物品可以从每个物品 ...
- Python多维约束(重量+体积+次数)背包问题(Knapsack Problem)
问题描述:1.一个背包,往里装东西,物品重量w(weight)对应为[2,3,4,7] ,价值va(value)对应为[1,4,7,12] ,如果你的最大承重为20,每个物品可装次数不限,求你能装入背 ...
- 【经典算法题-10】背包问题(Knapsack Problem)
欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料. 说明 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: ...
- 【算法】0-1背包问题(Knapsack problem)
百度百科背包问题: https://baike.baidu.com/item/背包问题/2416931?fr=aladdin #include<queue>#include<math ...
- 背包问题(Knapsack problem)采用动态规划求解
问题说明: 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物 品,假设是水果好了,水果的编号.单价与重量如下所示: 0 李子 4KG NT$4500 1 苹果 5KG NT ...
- 动态规划——背包问题(Knapsack Problem)入门
动态规划算法 应用场景-背包问题 有一个背包,容量为4磅,现有如下物品: 物品 重量 价格 吉他(G) 1 1500 音响(S) 4 3000 电脑(L) 3 2000 要求达到的目标为装入的背包 ...
- 背包问题(Knapsack Problem)
说明:假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: 0 李子 4KG NT$4500 1 苹果 5KG NT$570 ...
- Dynamic Programming 01 —knapsack problem(动态规划背包问题)
首先引入动态变化的含义:为什么要有动态规划? Introduction: 从斐波那契函数的递归中我们发现,在例子求fib(7)的过程中,我们需求得fib(5)和fib(6),而我们在求fib(6)的时 ...
- JavaScript实现Knapsack problem背包问题算法(附完整源码)
JavaScript实现Knapsack problem背包问题算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 MergeSort.js完整源代码 Knapsack ...
- 动态规划法(四)0-1背包问题(0-1 Knapsack Problem)
继续讲故事~~ 转眼我们的主人公丁丁就要离开自己的家乡,去大城市见世面了.这天晚上,妈妈正在耐心地帮丁丁收拾行李.家里有个最大能承受20kg的袋子,可是妈妈却有很多东西想装袋子里,已知行李的编 ...
最新文章
- C++模式学习------工厂模式
- 方差分析(Analysis of Variance,ANOVA)是什么?方差分析的形式有哪些?
- [Winform]默认以管理员身份运行程序
- hadoop centos 安装
- 计算机电路基础学什么,"计算机电路基础"学习辅导.doc
- AAAI论文首发:几何驱动的自监督的人体3D姿态估计方法
- android listview 数据同步,android中ListView数据刷新时的同步方法
- python 散点图 不同颜色_python – pandas – 每个点都有不同颜色图例的散点图
- matlab 高级函数
- sigar取得进程信息
- 微信小程序绘制图表(折线图、柱状图)
- 回顾史上25款经典芯片:曾震撼了世界
- Fernando Torres
- “全球发布——主流声音 · 最强路径”在深落幕 引领主流生态融合新模式
- 机器学习回归之商品x的网络消费购买预测实例(sklearn)包含数据集的训练与预测
- IT运维工单高效协同,助力打造一站式运维方案
- 1N4007、M7、A7整流二极管,有什么区别?
- c语言dfs算法初步讲解,[转载]算法初步
- 2018python教程百度云盘_『求老2018男孩Python最新全栈开发全套视频教程』python开发 百度云教程...
- 微软账号被暂时停用咋办_无需惊慌!微软漏洞数月后再被“预警” 打补丁即可防御...