题目链接:点击打开链接
题意:
朵朵喜欢看cartoon;
但她只有 l 的时间看;
她喜欢看 n 种cartoon;
但商店里只能卖 m 种;
对于每一种都会消耗 w[i] 的时间;
而看完之后她会得到 v[i] 的价值;
问朵朵能得到最大的价值;
如果不能看够 m 种,则输出 0;
理解:
在01背包的基础上多了一项条件;
即只有 m 种,并且 m 必须都买下来看完才行;
神解释说 二维01背包;
如何理解。。。
只能看看递推式:
dp[j][k] = max(dp[j][k], dp[j - 1][k - w[i]] + v[i]);
含义:前 i 种cartoon中买下 j 种在 k 的时间下取得的最大值;
其中 dp[i - 1][k - w[i]] != -1
即当前状态应该是有前面推导出的状态推导得来;
其中初始值为:dp[0][0 ~ l] = 0;
其它值都为 -1;
即不能达到要求;
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e7;
int dp[111][1111];
int main() {
int t;
cin >> t;
while (t--) {
memset(dp, -1, sizeof(dp));
int n, m, l;
cin >> n >> m >> l;
vector<int> w(n), v(n);
for (int i = 0; i < n; ++i) {
cin >> w[i] >> v[i];
}
for (int i = 0; i <= l; ++i) {
dp[0][i] = 0;
}
for (int i = 0; i < n; ++i) {
for (int j = m; j >= 1; --j) {
for (int k = l; k >= w[i]; --k) {
if (dp[j - 1][k - w[i]] != -1) {
dp[j][k] = max(dp[j][k], dp[j - 1][k - w[i]] + v[i]);
}
}
}
}
cout << (dp[m][l] == -1 ? 0 : dp[m][l]) << endl;
}
return 0;
}