基于C语言的背包问题(语言只是工具,重要的是思想)

在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。

1、建立模型,即求max(V1X1+V2X2+…+VnXn);

2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;

3、寻找递推关系式,面对当前商品有两种可能性:

包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。
其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i),但价值增加了v(i);

由此可以得出递推关系式:

j<w(i)      V(i,j)=V(i-1,j)
j>=w(i)     V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
这里需要解释一下,为什么能装的情况下,需要这样求解(这才是本问题的关键所在!):

可以这么理解,如果要到达V(i,j)这一个状态有几种方式?

肯定是两种,第一种是第i件商品没有装进去,第二种是第i件商品装进去了。没有装进去很好理解,就是V(i-1,j);装进去了怎么理解呢?如果装进去第i件商品,那么装入之前是什么状态,肯定是V(i-1,j-w(i))。由于最优性原理(上文讲到),V(i-1,j-w(i))就是前面决策造成的一种状态,后面的决策就要构成最优策略。两种情况进行比较,得出最优。

4、填表,首先初始化边界条件,V(0,j)=V(i,0)=0;

下面给出两个例题:

1、 其中i表示第i个物品,v[i]表示第i个物品的价值,w[i]表示第i个物品的重量(或者说是体积,只是说法不同)***这里的C=13,即容量为13

根据该题,可以画表:(也是题解)

从表中可知:28即为最大容量为13,能获得的最大价值

2、

这里直接给出表:

代码如下:!!!!!:光说不练,一点用也没有,只有实际动手了,知识、技能才是自己的。

代码写的比较仓促,可能存在bug,还请谅解。

这份代码主要是提供一个简单的思路吧:

#include<stdio.h>
#include<string.h>void toBag(int v[],int w[],int len,int size ){printf("\n最大容量为:%d\n",size);printf("\n商品的体积为:\n");for (int i = 0 ; i<len;i++){printf("%4d ",w[i]);} printf("\n商品的价值为:\n");for (int i = 0 ; i<len;i++){printf("%4d ",v[i]);}len=len+1;size=size+1;
//  printf("%d  %d",len,size);int p[len][size]={1};int record[len][size]={0};memset(p,0,sizeof(p));memset(record,0,sizeof(record));for (int i = 1; i<len;i++){for (int j = 1 ; j<size;j++){if (j<w[i-1]){//如果容量不够 .就不选当前这一物品 p[i][j]=p[i-1][j];}else{int temp = j-w[i-1];p[i][j]=p[i-1][j]>(p[i-1][temp]+v[i-1])?p[i-1][j]:(p[i-1][temp]+v[i-1]);if (p[i-1][j]<(p[i-1][temp]+v[i-1])){record[i][j]=1;       } }
//        p[i][j]=1;}}printf("\n\n记录表:") ; for (int i = 0; i<len;i++){printf("\n");for (int j = 0 ; j<size;j++){printf("%4d ",record[i][j]);}}  printf("\n");printf("\n\n最大价值表:");for (int i = 0; i<len;i++){printf("\n");for (int j = 0 ; j<size;j++){printf("%4d ",p[i][j]);}}  printf("\n"); int i = len-1;int j=size-1;while(i>0){if (record[i][j]==1){printf("第%d个物品已选\n",i);j-=w[i-1];}else{printf("第%d个物品未选\n",i);}i--;}}int main(){int w[] ={2,3,4,5};//物品的体积 int v[] = {3,4,5,6};//物品的价值 int size=8;//背包的最大容量 toBag(v,w,sizeof(v)/4,size);return 0;
}

下面是一些运行结果:

第一题运行结果:

第二题运行结果:

背包问题C/C++语言相关推荐

  1. 背包问题的C语言实现

    自打师哥布置了背包问题的作业之后,虽然看了不少次,但每次不是因为时间太紧,要不就是太难了老想逃避,一直没解决这个问题.终于借着学校运动会,抓紧时间看了看C 语言背包问题的实现,动态规划还是太难,只好先 ...

  2. 0-1背包问题 动态规划c语言,详解动态规划01背包问题--JavaScript实现

    一开始在接触动态规划的时候,可能会云里雾里,似乎能理解思路,但是又无法准确地表述或者把代码写出来.本篇将一步一步通过作图的方式帮助初次接触动态规划的同学来理解问题.这一篇将以经典的 01背包 问题为例 ...

  3. 0-1背包问题(C语言)

    任务描述 本关任务:编写一个能求解0-1背包问题的程序. 相关知识 为了完成本关任务,你需要掌握如何编写动态规划程序 有一个背包,能装载的总重量为C<300, 有 n<100个物体,每个物 ...

  4. 回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)

    问题:0/1背包问题 例子:weight数组代表物品重量,value数组代表物品价值,M代表背包容量.背包是按单位价值递减的顺序排列的,即value[i]/weight[i]>value[i-1 ...

  5. 动态规划之背包问题(C语言)

    动态规划 动态规划(英语:Dynamic programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最优子结构性质的问题 动 ...

  6. 贪心算法 背包问题代码 c语言,用贪心算法求解普通背包问题的C++代码

    用贪心算法求解普通背包问题的C++代码 2019年3月6日 125次阅读 来源: 贪心算法 #include #define  M  100 void display(int &n,doubl ...

  7. 让你轻松搞懂0-1背包问题(动态规划 C语言版)

    题目描述 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 举一个例子: 有一个小偷他有一个容量为8的背包 物体的体积和价值如下所示: 物体编号 物体 ...

  8. 遗传算法之01背包问题 (C语言实现)

    参数说明 n:物品个数 m:种群大小 W:背包容量 其中 a[i] 存储的物品信息 ,g[i]存储基因信息. maxn :物品数的最大值 maxm :种群数的最大值 注意事项 m 最好是 n 的10倍 ...

  9. 粒子群算法之01背包问题(C语言实现)

    参数说明 Vi(t+1)=ωVi(t)+c1r1(pbesti−Xi(t))+c2r2(gbest−Xi(t)) 根据粒子群算法速度迭代公式: w:惯性因子 c1,c2:学习率 r1,r2:[0,1] ...

最新文章

  1. Oracle开发:normal ,sysdba,sysoper区别
  2. 物体识别算法——SIFT/SURF、haar特征、广义hough变换的对比分析
  3. mysql 密码加密windows_Windows下mysql数据库的安装及8.0以上版本设置密码的命令(简易教学)...
  4. 《构建之法》8、9、10章
  5. Courses hdu 1083(匹配)
  6. vs.net各版本解决方案相互转换工具
  7. 高仿科学刀论坛源码 DZ模板
  8. 玩出花,只用文本就能干CV的活!
  9. 【Java】Base64编码与解码
  10. 费尔德曼的百吉饼实验:人类的诚实程度其实超出你的想象!
  11. python天下无敌表情包_这套打遍天下无敌手的“算我输”表情包 从哪儿蹦出来的?...
  12. 逆变H桥IGBT单管驱动+保护
  13. 人生的路很远,一路小心
  14. python控制多个屏幕_使用python的多个屏幕
  15. C#中的动态类型(Dynamic)
  16. vue3+vite+TS配置项目别名“@/“
  17. Android本地文件存储,机身和外置sd卡
  18. 移动端测试介绍和练习
  19. python opencv pdf脚本之家_Python-OpenCV
  20. 在OTFS学习中的一些总结

热门文章

  1. 加域“不能访问网络位置”处理
  2. 计算机应用700字自我鉴定,有关计算机应用自我鉴定
  3. 计算机管理windows无法访问指定设备,windows无法访问指定设备路径或文件如何解决...
  4. 全渠道会员通-天猫会员通2: 常见问题
  5. AVI 文件格式解析
  6. Apollo坐标系转换
  7. Ubuntu/Windows下利用“HIDAPI”库函数实现与Hid类USB设备通信
  8. 可敬可悲硅谷人 科技富豪失乐园
  9. C语言总结这一篇就够了(不收藏必后悔系列)
  10. 【对比Java学Kotlin】object 关键字