背包问题模板
描述
-
条件:现需最多挑选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]中的记录进行比较,取二者最大值,更新函数图像。
依次遍历,最终取函数末值,则为最大价值。

浙公网安备 33010602011771号