背包问题,动态规划求解,matlab代码,c语言,c++代码
来源:互联网 发布:dota 知乎 编辑:程序博客网 时间:2024/05/20 13:19
最近写论文接触到背包问题,查阅网上一些资料,对于简单的背包问题,动态规划算法可以求解,最近花时间整理整理。
背包问题描述:
有编号分别为a,b,c,d,e 的五件物品,它们的重量分别是 2,2,6,5,4,它们的价值分别是 6,3,5,4,6,现在给你个承重为 10 的背包,如何让背包里装入的物品具有最大的价值总和? (假设每类物品可以装多个)
根据求解动态规划问题的步骤,一步一步来。用 ci 表示各物品的重量,vi 表示各物品的价值。
阶段:
,
第 i 阶段表示检查第 i 个物品。
状态变量:
表示检查第 i 个物品时包中的剩余承重量。一个问题能够用动态规划算法求解,必须保证状态空间是有限的。
决策变量:
表示第 i 个物品装入几个。
状态转移方程:
最优收益函数:
表示检查第 i 个物品时,当包中剩余承重为 Si,包中装入物品 i, i+1, ... 5 能达到的最大价值。
最优收益函数转移方程:
得到最优转移方程时,就可以求解了。从上式可以看出要用逆推法求解。当然也可以用顺推法求解,不过需要改变最优收益函数的定义。
动态规划求解时,都可以用矩阵来递推。
用了一位的前辈的图: http://blog.csdn.net/mu399/article/details/7722810。 我稍微改了下,不是0-1 背包,每类物品可以装多个。
这个图画的真不错!只是少了一列,s=0 的一列。
最优解是装入 5 个物品 a !
matlab 代码:
function Knapsackc=[2 2 6 5 4];v=[6 3 5 4 6];f=zeros(5,11);x=zeros(5,11);xx=zeros(5,1);for i=5:-1:1 for S=0:10 if i==5 f(i,S+1)=v(i)*floor(S/c(i)); x(i,S+1)=floor(S/c(i)); else xMax=floor(S/c(i)); ff=zeros(xMax+1,1); for k=0:xMax ff(k+1)=v(i)*k+f(i+1,S-c(i)*k+1); end [f(i,S+1),index]=max(ff); x(i,S+1)=index-1; end endend[optValue,index]=max(f(1,:));xx(1)=x(1,index);tempS=index;fprintf('optimal solution:%d\n',optValue);for i=2:5 xx(i)=x(i,tempS-c(i-1)*xx(i-1)); tempS=tempS-c(i-1)*xx(i-1);endfor i=1:5 fprintf('put %d item%d in the bag\n',xx(i),i);endend
输出结果:optimal solution:15
put 0 item1 in the bag
put 1 item2 in the bag
put 0 item3 in the bag
put 0 item4 in the bag
put 2 item5 in the bag
c 语言代码,我编写成了 cpp格式,因为严格的c语言规范太多束缚了,不好编译通过,必须首先声明变量才能使用。不能同时声明同时使用,很不方便。
用到了动态数组,以及能够返回一个数组的函数。
#include"stdio.h"#include"stdlib.h"int * Max(int *arr, int n){int *a=(int *)malloc(2*sizeof(int));a[0]=0;a[1]=0;for (int i=0;i<n;i++){if (arr[i]>a[0]){a[0]=arr[i];a[1]=i;}}return a;}void main(){static const int c[5]={2,2,6,5,4};static const int v[5]={6,3,5,4,6};int f[5][11];int x[5][11];int itemNum[5];for (int i=5;i>0;i--)for (int S=0;S<11;S++){if (i==5){f[i-1][S]=v[i-1]*(S/c[i-1]);x[i-1][S]=S/c[i-1];}else{int xMax=S/c[i-1];int * ff= (int *)malloc(sizeof(int)*(xMax+1));for(int k=0;k<=xMax;++k)ff[k]=v[i-1]*k+f[i][S-c[i-1]*k];int *a=Max(ff,xMax+1);f[i-1][S]=a[0];x[i-1][S]=a[1];free(a);free(ff);}}int *temp=f[0];int *maxValue=Max(temp,11);int tempS=maxValue[1];itemNum[0]=x[0][tempS];for (int i=1;i<5;++i){itemNum[i]=x[i][tempS-c[i-1]*itemNum[i-1]];tempS-=c[i-1]*itemNum[i-1];}printf("the optimal solution is: %d\n",maxValue[0]);for(int i=0;i<5;i++)printf("put %d item%d in the bag\n",itemNum[i],i+1);free(maxValue);}
- 背包问题,动态规划求解,matlab代码,c语言,c++代码
- 编程算法 - 背包问题(三种动态规划) 代码(C)
- 编程算法 - 背包问题(三种动态规划) 代码(C)
- 动态规划-背包问题求解过程【代码 from eason】
- 动态规划求解01背包问题初探(C版)
- 随机动态规划,随机库存管理,matlab 代码, c 代码
- 01背包问题--C语言代码
- 0-1背包 动态规划原理与c代码
- 0-1背包问题与动态规划的C/C++代码
- 0-1背包问题(动态规划C语言实现)
- 动态规划之背包问题(C语言)
- 01背包问题 动态规划 c语言实现
- 利用动态规划法求解旅行商问题(TSP)的C语言实现(一)
- C语言及程序设计进阶例程-28 动态规划法问题求解
- 动态规划求解01背包问题
- 0-1背包问题,动态规划求解
- 01背包问题动态规划法求解
- 动态规划求解0-1背包问题
- securecrt注册方法
- iOS UIFont 字体大全
- Android N新特性:direct reply notification
- SELinux 学习笔记
- java.util.concurrent介绍
- 背包问题,动态规划求解,matlab代码,c语言,c++代码
- ANDROID自定义视图——onMeasure流程,MeasureSpec详解
- Android5.0常用颜色属性说明
- JSON和js对象转换
- Servlet 工作原理解析
- Spring @Autowired注解与自动装配
- LINUX 驱动学习之路 -设备模型之别人的理解(3)
- 【NAS】NFS客户端阻塞睡眠问题与配置调研
- HDU 5514 Frogs(容斥)