这个问题有两种解法,动态规划和贪婪算法。本文仅涉及动态规划。

先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决?

首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。

其次,可以先把价值最大的物体放入,这已经是贪婪算法的雏形了。如果不添加某些特定条件,结果未必可行。

最后,就是动态规划的思路了。先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。

表达式中各个符号的具体含义。

w[i] :  第i个物体的重量;

p[i] : 第i个物体的价值;

c[i][m] : 前i个物体放入容量为m的背包的最大价值;

c[i-1][m] : 前i-1个物体放入容量为m的背包的最大价值;

c[i-1][m-w[i]] : 前i-1个物体放入容量为m-w[i]的背包的最大价值;

由此可得:

c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}(下图将给出更具体的解释)

根据上式,对物体个数及背包重量进行递推,列出一个表格(见下表),表格来自(http://blog.csdn.net/fg2006/article/details/6766384?reload) ,当逐步推出表中每个值的大小,那个最大价值就求出来了。推导过程中,注意一点,最好逐行而非逐列开始推导,先从编号为1的那一行,推出所有c[1][m]的值,再推编号为2的那行c[2][m]的大小。这样便于理解。

思路厘清后,开始编程序,C语言代码如下所示。

#include

int c[10][100]={0};

void knap(int m,int n){

int i,j,w[10],p[10];

for(i=1;i

scanf("%d,%d",&w[i],&p[i]);

for(j=0;j

for(i=0;i

{

if(j

{

c[i][j]=c[i-1][j];

continue;

}else if(c[i-1][j-w[i]]+p[i]>c[i-1][j])

c[i][j]=c[i-1][j-w[i]]+p[i];

else

c[i][j]=c[i-1][j];

}

}

int main(){

int m,n;int i,j;

printf("input the max capacity and the number of the goods:\n");

scanf("%d,%d",&m,&n);

printf("Input each one(weight and value):\n");

knap(m,n);

printf("\n");

for(i=0;i<=n;i++)

for(j=0;j<=m;j++)

{

printf("%4d",c[i][j]);

if(m==j) printf("\n");

}

}

代码中,红色字体部分是自己写的,其余的参照了这篇博客http://blog.sina.com.cn/s/blog_6dcd26b301013810.html

如果你很轻松地就突破了01背包,甚至很轻松地就理解了动态规划,那么继续前进,做一下这道题目(http://acm.uestc.edu.cn/problem.php?pid=1012)。很好玩的。

//输入描述://输入的第 1 行,为两个正整数,用一个空格隔开:N m//(其中 N ( <32000 )表示总钱数, m ( <60 )为希望购买物品的个数。)//

//从第 2 行到第 m + 1 行,第 j 行给出了编号为 j - 1 的物品的基本数据,每行有 3 个非负整数 v p q//

//(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 ~5 ), q 表示该物品是主件还是附件。如果 q = 0 ,//表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)//

//输出描述 ://输出文件只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值( <200000 )。//动态规划,(0,1)背包问题

#include

using namespacestd;

#include#include#include

structInputBuf

{intprice;intweight;inttype;

};struct InputBuf inputBuf[60];int sum_money = 0;int sum_num = 0;int countMaxvalue(int index, int money, intf)

{int a = 0, b = 0;if (index >= sum_num) return 0;if (inputBuf[index].type == 0) //主件

{if (money >=inputBuf[index].price)

{

a= countMaxvalue(index + 1, money - inputBuf[index].price, 1) + inputBuf[index].price * inputBuf[index].weight; //买第index件物品的附件

b = countMaxvalue(index + 1, money, 0); //买主件

return a > b ?a : b;

}else

return countMaxvalue(index + 1, money, 0);

}else if ((inputBuf[index].type != 0) && (f == 1)) //附件,且主件必须买

{if (money >=inputBuf[index].price)

{

a= countMaxvalue(index + 1, money - inputBuf[index].price, f) + inputBuf[index].price *inputBuf[index].weight;

b= countMaxvalue(index + 1, money, f);return a > b ?a : b;

}

}else{return countMaxvalue(index + 1, money, f);

}return 0;

}int main(void)

{int i = 0;

scanf("%d %d", &sum_money, &sum_num);for (i = 0; i < sum_num; i++)

{

scanf("%d %d %d", &inputBuf[i].price, &inputBuf[i].weight, &inputBuf[i].type);

}

printf("%d", countMaxvalue(0, sum_money, 1));return 0;

}

matlab 背包问题动态规划,从01背包问题理解动态规划---初体验相关推荐

  1. 经典动态规划:0-1 背包问题

    经典动态规划:0-1 背包问题 文章目录 经典动态规划:0-1 背包问题 一.题目描述 二.动规标准套路 三.题目描述 四.解法分析 五.优化 一.题目描述 就讨论最常说的 0-1 背包问题,简单描述 ...

  2. o-1背包问题迭代_经典动态规划:01背包问题的变体

    点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong   公众号:labuladong 若已授权白名单也必须保留以上来源信息 上篇文章 经典动态规划:0-1 背包问题 详解了通用的 ...

  3. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  4. 动态规划解决0-1背包问题详解(图文并茂)

    动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...

  5. 力扣刷题-python-动态规划-1 (动态规划、01背包问题、完全背包问题)

    文章目录 1.动态规划 2.简单和中等题 3.01背包问题基础 4.01背包问题 5.完全背包 6.总结 1.动态规划 动态规划 是由前一个状态推导出 贪心算法 是直接取局部最优 动态规划需要直到状态 ...

  6. [OpenGL ES 01]OpenGL ES之初体验

    [OpenGL ES 01]OpenGL ES之初体验 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循"署名-非商业用途-保持一致"创作公用协议 一 ...

  7. 01背包问题:图表法带你快速理解动态规划解决01背包问题 附C++源码

    0-1背包问题 所谓0-1背包问题,也就是给你一个重量为M的背包和n种物品,每种物品有一定的重量和价值,在每种物品均可装入背包1次或不装入(不能仅装入物品的一部分)且不超过背包载重量的前提下,问你怎样 ...

  8. 动态规划专题 01背包问题详解【转】

    对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本 ...

  9. 动态规划之01背包问题

    满篇都是干货,有详细的注释和代码,请放心观看. 这就是传说中的 01 背包问题,这个问题看到之后主要有两种思路: 一.贪心做法(错误想法) 这道题如果没有学过 01 背包问题的话,很容易想成一个贪心的 ...

最新文章

  1. 数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!
  2. request.getServletPath()和request.getPathInfo()用法
  3. 深入理解Blocks,Procs和lambdas
  4. you don't have permission to access /xxx/xxx解决
  5. weblogic获取应用目录路径
  6. php make,安装PHP出现make:
  7. javascript 搜索并高亮显示
  8. 在c语言Windows窗口添加按钮,C语言用windows.h创建按钮的问题
  9. Python语言基本语法元素
  10. 山海演武传·黄道·第一卷 雏龙惊蛰 第十三章 穷奇长梦(上) 十四 穷奇长梦(下)...
  11. 数字通信学习笔记——自相关函数、随机信号
  12. html5制作涂鸦板,HTML5实现涂鸦板
  13. 芝士合集(以便查看)
  14. MAC下格式化移动硬盘
  15. jedi-vim --- vim python 自动补全工具安装
  16. 博客变味:从一方净土沦落为企业枪手
  17. Redis 官方可视化工具,功能真的强大
  18. 硬盘结构,主引导记录MBR,硬盘分区表DPT,主分区、扩展分区和逻辑分区
  19. 移植TFT-LCD到HAL库
  20. c语言循环题兔子第三个月生,C语言·古典问题: 兔子总数

热门文章

  1. ASP.net的ItemDataBound事件与LinqToSql数据源关于e.Item.DataItem的类型
  2. 集成学习(Ensemble Learning),Bagging、Boosting、Stacking
  3. 青蛙过河游戏c语言,C语言动态规划(7)___过河(Vijos P1002)
  4. HP-UX实战:扩展HP小机rx8640上的swap和dump空间
  5. 数据分析:什么是业务?全面解析问题
  6. c语言米粒数实验报告,数字图像处理实验报告米粒
  7. 零基础如何去入门学习UI设计?学习步骤是什么?
  8. 苹果11自带测试软件,9款旗舰系统对比 iPhone 11居然不是最好用的
  9. Linux服务器基本安全防范
  10. 【HDL系列】半加器、全加器和行波进位加法器原理与设计