问题引入

假设有一个背包的负重最多可达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

450

450

450

450

900

item

放入苹果

背包

1

2

3

4

5

6

7

8

负重

value

450

570

570

570

900

item

1

1

1

放入橘子

背包

1

2

3

4

5

6

7

8

负重

value

225

225

450

570

675

795

900

item

2

2

1

2

2

放入草莓

背包

1

2

3

4

5

6

7

8

负重

value

110

225

335

450

570

680

795

905

item

3

2

3

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

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)相关推荐

  1. C#,背包问题(Knapsack Problem)贪心算法的源代码

    背包问题(KnapSack Problem)的相关算法是常用的规划算法. 一.什么是背包问题? 背包的问题是,你有一个"袋子",可以装有限数量的物品,鉴于你有一组物品可以从每个物品 ...

  2. Python多维约束(重量+体积+次数)背包问题(Knapsack Problem)

    问题描述:1.一个背包,往里装东西,物品重量w(weight)对应为[2,3,4,7] ,价值va(value)对应为[1,4,7,12] ,如果你的最大承重为20,每个物品可装次数不限,求你能装入背 ...

  3. 【经典算法题-10】背包问题(Knapsack Problem)

    欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料. 说明 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: ...

  4. 【算法】0-1背包问题(Knapsack problem)

    百度百科背包问题: https://baike.baidu.com/item/背包问题/2416931?fr=aladdin #include<queue>#include<math ...

  5. 背包问题(Knapsack problem)采用动态规划求解

    问题说明: 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物 品,假设是水果好了,水果的编号.单价与重量如下所示: 0 李子 4KG NT$4500 1 苹果 5KG NT ...

  6. 动态规划——背包问题(Knapsack Problem)入门

    动态规划算法 应用场景-背包问题 ​ 有一个背包,容量为4磅,现有如下物品: 物品 重量 价格 吉他(G) 1 1500 音响(S) 4 3000 电脑(L) 3 2000 要求达到的目标为装入的背包 ...

  7. 背包问题(Knapsack Problem)

    说明:假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: 0 李子 4KG NT$4500 1 苹果 5KG NT$570 ...

  8. Dynamic Programming 01 —knapsack problem(动态规划背包问题)

    首先引入动态变化的含义:为什么要有动态规划? Introduction: 从斐波那契函数的递归中我们发现,在例子求fib(7)的过程中,我们需求得fib(5)和fib(6),而我们在求fib(6)的时 ...

  9. JavaScript实现Knapsack problem背包问题算法(附完整源码)

    JavaScript实现Knapsack problem背包问题算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 MergeSort.js完整源代码 Knapsack ...

  10. 动态规划法(四)0-1背包问题(0-1 Knapsack Problem)

      继续讲故事~~   转眼我们的主人公丁丁就要离开自己的家乡,去大城市见世面了.这天晚上,妈妈正在耐心地帮丁丁收拾行李.家里有个最大能承受20kg的袋子,可是妈妈却有很多东西想装袋子里,已知行李的编 ...

最新文章

  1. C++模式学习------工厂模式
  2. 方差分析(Analysis of Variance,ANOVA)是什么?方差分析的形式有哪些?
  3. [Winform]默认以管理员身份运行程序
  4. hadoop centos 安装
  5. 计算机电路基础学什么,"计算机电路基础"学习辅导.doc
  6. AAAI论文首发:几何驱动的自监督的人体3D姿态估计方法
  7. android listview 数据同步,android中ListView数据刷新时的同步方法
  8. python 散点图 不同颜色_python – pandas – 每个点都有不同颜色图例的散点图
  9. matlab 高级函数
  10. sigar取得进程信息
  11. 微信小程序绘制图表(折线图、柱状图)
  12. 回顾史上25款经典芯片:曾震撼了世界
  13. Fernando Torres
  14. “全球发布——主流声音 · 最强路径”在深落幕 引领主流生态融合新模式
  15. 机器学习回归之商品x的网络消费购买预测实例(sklearn)包含数据集的训练与预测
  16. IT运维工单高效协同,助力打造一站式运维方案
  17. 1N4007、M7、A7整流二极管,有什么区别?
  18. c语言dfs算法初步讲解,[转载]算法初步
  19. 2018python教程百度云盘_『求老2018男孩Python最新全栈开发全套视频教程』python开发 百度云教程...
  20. 微软账号被暂时停用咋办_无需惊慌!微软漏洞数月后再被“预警” 打补丁即可防御...

热门文章

  1. 用户故事与敏捷方法—估算用户故事
  2. 网维无盘服务器错误代码,网维大师无盘环境INTER傲腾方案常见问题解答?
  3. 酒店管理系统c语言课程设计,基于C语言的酒店管理系统课程设计.doc
  4. UtIL DBUtil
  5. 上海城市坐标系转换的空间校正方法(附控制点文件)
  6. Xamarin.Forms入门学习路线
  7. 工业设备数据采集系统-采集精灵
  8. protues软件仿真-LCD1602
  9. 基于随机森林模型的心脏病患者预测及可视化(pdpbox、eli5、shap、graphviz库)附相关库安装教程
  10. Python 安装配置VLFeat