【题目描述】
有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。
第 i 种物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
【输入格式】
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。
【输出格式】
输出一个整数,表示最大价值。
【分析过程】
与普通背包问题不同的是,此题中一个物品可以拿多次,因此如果采用闫氏Dp法的话我们发现现在f[i][j](i表示正在处理第i个物品,j表示目前背包的容量,f表示这种情况下的最大价值)的集合中不止是包含2中情况,而是多种情况
由此看来需要每个次数的情况都需要进行比较,但是这样会使得时间复杂度非常高,因此我们需要对其进行优化,而我们会发现
因此就可以用以下代码实现
【代码】
#include <iostream>
using namespace std;
const int N = 1001;
int dp[N][N],w[N],v[N];
int n,m;
//闫氏DP
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
cin >> v[i] >> w[i];
for(int j = 1;j <= m;j++)
{
dp[i][j] = dp[i-1][j];
if(j >= v[i])
dp[i][j] = max(dp[i-1][j],dp[i][j-v[i]] + w[i]);
}
}
cout << dp[n][m];
}