01-背包问题

背包问题:

  1.01-背包是最为广泛的动态规划问题,拥有许多变形,下面是一个简单的简历。

        物品无限背包问题 : 用N种物品,每种均有无限多个,第i种物品体积为Vi,重量为Wi。选一些物品装到一个容量为C的背包中使得背包内的物体总体积在不超过C的前提下物体的重量最大?

   分析:类似于硬币问题,只不过是把面值之和最大不超过S变为体积之和不超过C,另外增加了一个新的属性---重量相当于把无权图变成了带权图。这样就变成了以C为起点边权之和最大的路径。

#include <iostream>
#include <queue>
#include <functional>
using namespace std;

const int maxn = 100;
int vis[maxn], d[maxn];
int v[maxn], w[maxn];
int n, c;

int dp(int c)
{
    int &ans = d[c];
    if (ans != -1)
        return ans;
    ans = -(1 << 20);
    for (int i = 0; i < n; i++)
    {
        if (c >= v[i])
        {
            ans = max(ans, dp(c - v[i]) + w[i]);
        }
    }
    return ans;
}

int main()
{
    cin >> n>>c;
    for (int i = 0; i < n; i++)
        cin >> v[i] >> w[i];
    memset(d, -1, sizeof(d));
    d[0] = 0;
    cout<<dp(c);
    system("pause");
}

 2.01—背包问题2:

     1.有N种物品,每种只有一个,第i种物品的体积为Vi,重量为Wi,选一些物品装到一个容量为C的背包中,使得背包内物体在不超过C的前提下尽量最大.(n>=1&&n<=100,v>=1&&v<=C&&C<=100,w>=1&&w<=1000000)

状态转移方程  F(i,j)=max{F(i-1,j),F(i-1,j-V[i])+W[i]};

点击打开链接 图表有助理解

下面没有理解:

//  分析:①此问题与上面问题不太一样,每个物品只有一个,此时上面的方法已经不适用了,可通过状态转移方程解决。

 //          ②用d(i,j)表示当前在第i层,背包剩余容量在j时接下来的最大重量和 d(i,j)=max(d(i+1,j),d(i+1,j-v[i]))+w[i];

  //   解决:

 //        for(int i=n;i>=1;i--)

  //           for(int j=0;j<=C;j++)

  //              {

    //               d[i][j]=(i==n?0:d[i+1][j]);

    //               if(j>=v[i])

      //             d[i][j]=max(d[i][j],d[i][j-V[i]]+W[i]);

        //        }

猜你喜欢

转载自blog.csdn.net/wangzhaoweng/article/details/79826647