背包问题模板

描述

  • 条件:现需最多挑选N种物品,最多容纳V体积

  • 输入:现有i件物品,每件物品含有3个属性:数量m,体积w,价值s

  • 输出:满足条件情况下的最大价值

  • Example

现允许最多挑选2种物品,背包最多容纳体积10

以下为2种物品的数量,体积,价值信息

数量m 体积w 价值s
3 4 3
2 5 2

解答

#include<iostream>
#include <vector>
using namespace std;

int main()
{
    //输入可挑选最大种类N和可容纳最大体积V,现有物品种类I
    int N, V;
    cin >> N >> V;
    
    vector<int> mArray, wArray, sArray;
    for (int i = 0; i < N; i++)
    {
        int m,w,s;
        cin >> m >> w >> s;
        mArray.push_back(m);
        wArray.push_back(w);
        sArray.push_back(s);
    }

    int dp[100] = {0};//dp[i]表示i体积下最大的价值

    for (int i = 0; i < N; i++)//挑选第i种物品
    {
        for (int j = V; j >= wArray[i]; j--)//背包中剩余体积
        {
            for (int k = 0; k <= mArray[i] && k * wArray[i] <= j; k++)//第i种物品挑选k件
            {
                dp[j] = dp[j] > dp[j - k*wArray[i]] + sArray[i] * k ? dp[j] : dp[j-k*wArray[i]] + sArray[i]*k;
            }
        }
    }

    cout << dp[V] << endl;
}

分析

该解答为背包问题解答模板。具体思路为,通过首次遍历完成V时,可得只挑选第0件物品时的一张的S-V的函数图像,以上题为例:

当挑选第二件物品时,与s[v]中的记录进行比较,取二者最大值,更新函数图像。
依次遍历,最终取函数末值,则为最大价值。

posted @ 2020-04-11 00:06  _Fusion  阅读(96)  评论(0)    收藏  举报