动态规划求解0-1背包问题
2017-09-18 16:23
281 查看
动态规划求解0-1背包问题
问题描述:给定N中物品和一个背包。物品i的重量是wi,其价值位vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?
在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能讲物品i装入多次,也不能只装入物品的一部分。因此,该问题被称为0-1背包问题。
问题分析:令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:
(1) V(i,0)=V(0,j)=0
(2) V(i,j)=V(i-1,j) j < wi
V(i,j)=max{V(i-1,j) ,V(i-1,j-wi)+vi) } j>wi
(1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包;第(2)个式子表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-wi 的背包中的价值加上第i个物品的价值vi; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。
#include<iostream> #include<stdio.h> using namespace std; int V[15][100]; void GetMaxValue(int n, int k,int a[15],int b[15], int *s){ const int *w = a; const int *v = b; for(int i = 0; i <= k; i++){ V[0][i] = 0; } for(int i = 0; i <= n; i++){ V[i][0] = 0; } for(int i = 1; i <= n; i++){ for(int j = 1; j <= k; j++){ if(j < w[i-1]) V[i][j] = V[i-1][j]; else V[i][j] = max(V[i-1][j], V[i-1][j-w[i-1]]+v[i-1]); } } int y = k; for(int i = n; i > 0; i--){ if(V[i][y] != V[i-1][y]){ s[i-1] = 1; y = y - w[i-1]; } } } int main(){ int w[15]; int v[15]; int s[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int n; int k; cout<<"请输入背包的最大容量:"; cin>>k; cout<<"请输入物品总数:"; cin>>n; cout<<"请输入每个物品的重量:"<<endl; for(int i = 0; i < n; i++){ scanf("%d",w+i); } cout<<"请输入每个物品的价值:"<<endl; for(int i = 0; i < n; i++){ scanf("%d",v+i); } GetMaxValue(n, k, w, v, s); cout<<V [k]<<endl; for(int i =0; i< n; i++){ if(s[i]) cout<< i <<" "; } cout<<endl; return 0; }
相关文章推荐
- 《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解
- 背包问题,动态规划求解,matlab代码,c++代码
- 0-1背包问题及其动态规划求解之二——王晓东的书本解法
- 《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解
- 用动态规划求解0-1背包问题
- 用动态规划求解0-1背包问题
- 0/1背包问题-----动态规划求解
- 物件捆绑 背包问题 动态规划 求解
- 0/1背包问题(动态规划求解)
- 动态规划求解0-1背包问题
- 0-1背包问题,动态规划求解
- 动态规划求解0-1背包问题
- 动态规划求解01背包相关的基本问题
- 动态规划求解背包问题(java版本)
- 算法导论第16章 贪心算法-0-1背包问题—动态规划求解
- 动态规划求解背包问题(JAVA实现)
- Java 动态规划求解0-1背包问题
- 动态规划求解0/1背包问题
- 背包问题——“01背包”详解及实现(包含背包中具体物品的求解)
- 华为oj上的购物单问题,背包问题的变种,动态规划