动态规划之背包问题

问题描述:
问题可以描述为:有 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[N][C];
}

猜你喜欢

转载自blog.csdn.net/gary_god/article/details/79140525