说明:假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号、单价与重量如下所示:

0 李子 4KG NT$4500
1 苹果 5KG NT$5700
2 橘子 2KG NT$2250
3 草莓 1KG NT$1100
4 甜瓜 6KG NT$6700

解法:背包问题是关于最佳化的问题,要解最佳化问题可以使用「动态规划」(Dynamic programming),从空集合开始,每增加一个元素就先求出该阶段的最佳解,直到所有的元素加 入至集合中,最后得到的就是最佳解。 以背包问题为例,我们使用两个阵列value与item,value表示目前的最佳解所得之总价,item表 示最后一个放至背包的水果,假设有负重量 1~8的背包8个,并对每个背包求其最佳解。 逐步将水果放入背包中,并求该阶段的最佳解: 放入李子 在背包负重8公斤时,最多可以装入9050元的水果,而最后一个装入 的 水果是3号,也就是草莓,装入了草莓,背包只能再放入7公斤(8-1)的水果,所以必须看背 包负重7公斤时的最佳解,最后一个放入的是2号,也就 是橘子,现在背包剩下负重量5公斤(7- 2),所以看负重5公斤的最佳解,最后放入的是1号,也就是苹果,此时背包负重量剩下0公斤(5- 5),无法 再放入水果,所以求出最佳解为放入草莓、橘子与苹果,而总价为9050元。

#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(void) {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;
}

背包问题(Knapsack Problem)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. Knapsack Problem

    背包九讲 0-1 knapsack problem 01背包-牛客网 已知一个背包最多能容纳体积之和为V的物品,现有 n 个物品,第 i 个物品的体积为 vi , 重量为 wi,求当前背包最多能装多大 ...

  7. [Algorithmic Toolbox学习笔记][week6]0/1 Knapsack Problem

    问题描述 具体的问题描述请参考以下链接: [Algorithmic Toolbox学习笔记][week3]战利品的最大价值_Karen_AMPM的博客-CSDN博客假设小偷有一个背包只能放下一定重量的 ...

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

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

  9. Knapsack Problem(0-1背包问题)

    0-1背包问题,是说给定 n 个物体,每个物体都有一定的重量和价值,再给一个能容纳最大重量为 w 的背包.求从 n 个物体中选出若干个放到背包中,在所选物体总重量不超过 w 的情况下,所选物体的总价值 ...

  10. FZU 2214 Knapsack problem(背包问题)

    Description 题目描述 Given a set of n items, each with a weight w[i] and a value v[i], determine a way t ...

最新文章

  1. qq在线咨询代码,MSN在线代码,贸易通在线留言源代码!
  2. python 四种单例模式
  3. 佛山居住证办理(首次)
  4. Java反射最佳实践
  5. JZOJ 5622. 【NOI2018模拟4.2】table
  6. android studio1.5 for mac,适用于Mac的Android Studio 1.5.x随机崩溃
  7. 【Java】synchronized与lock的区别
  8. edup无线网卡驱动安装linux,UBUNTU_15.0.4 usb无线网卡驱动安装方法
  9. 手工编译Flex SDK 多国语言包
  10. java对象的哈希值_对象的哈希值
  11. FPGA下载方式AS.PS,JTAG对比
  12. Cocoa Touch框架浅析
  13. 44个“区块链+AI”应用场景分析, 你觉得还能更全吗?
  14. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)
  15. Sun Java 国际认证考试流程表
  16. Windows 安装 MySQL 8 zip版安装,及Windows MySQL多实例
  17. 大数据生态系统 修仙之道 Hadoop Blog
  18. 如何利用Excel快速批量创建文件夹
  19. PAP认证与CHAP认证的区别
  20. 六、Django-Registration-Redux的基本使用

热门文章

  1. 重装win10、ubuntu和双系统
  2. MapInfo7.0序列号和许可文件
  3. 详解ISO 13400文档(DoIP协议)-5
  4. 集算器入门之安装与基本使用
  5. 亚马逊推中文Kindle书店
  6. SEO中常见的专业术语
  7. 晨曦记账本简单记录日常收支
  8. 单链表反序(反转)C++实现
  9. 如何消除FTP所保存的默认密码
  10. 免费打电话:Skype and Wengo