您的位置:首页 > 其它

动态规划之背包问题

2018-01-23 15:37 211 查看
问题描述:

问题可以描述为:有 N 件物品和一个容量为 V 的背包。第 i 件物品的体积是 s[i],其价值是 v[i]。求解,在不超过背包容量情况下,将哪些物品装入背包可使价值总和最大。

思路:

动态规划。令V[i][j]代表,从前i项物品中取出若干项,装入体积为j的背包中能得到的最大价值。那么很自然的,V[i][j]是下面两个量的最大值:

1.V[i-1][j],也就是,第i项物品不放进背包,仅用最优的方法在前i-1项物品中选取若干项物品去装入体积为j的背包所得到的价值最大值。

2.V[i-1,j-s[i]]+v[i],也就是,第i项物品要放进背包。用最优的方法在前i-1项物品中选取若干项物品去装入体积为j-s[i] (s[i]是第i项物品的体积)的背包所得到的价值最大值,再加上第i项物品的价值。这有个条件,即j>=s[i]。

代码

#include<iostream>
using namespace std;
int main()
{
const int N=6;//代表物品个数,物品编号从1开始
const int C=10;//代表背包体积
int V[N+1][C+1];//V[i][j]代表,从前i项物品中取出若干项,装入体积为j的背包中能得到的最大价值
int s[N+1]={0,5,6,5,1,19,7};//6个物品的体积
int v[N+1]={0,2,3,1,4,6,5};//6个物品的价值
for(int i=0;i<=N;i++)
V[i][0]=0;//初始化,背包体积为0,肯定价值为0
for(int j=0;j<=C;j++)
V[0][j]=0;//初始化,不能选物品,肯定价值为0
for (int i=1;i<=N;i++)
for(int j=1;j<=C;j++)
{
V[i][j]=V[i-1][j];
if(s[i]<=j&&(V[i][j]<V[i-1][j-s[i]]+v[i]))
V[i][j]=V[i-1][j-s[i]]+v[i];
}
return V
[C];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划