特征
第 i i i件物品最多可以有 p [ i ] p[i] p[i]个可以取用
板子(无优化)
for (int i = 1; i <= n; i++)
for (int j = V; j >= c[i]; j--)//v是背包容量
for (int k = 1; k <= p[i] and k * c[i] <= j; k++)
f[j] = max(f[j], f[j - c[i] * k] + w[i] * k);
板子(二进制优化)
for (int i = 1;i <= n;i++) {
int num = min(p[i], v / c[i]);
for (int k = 1;num > 0;k<<=1) {
if (k > num)k = num;
num -= k;
for (int j = v;j >= c[i] * k;j--) {
dp[j] = max(dp[j], dp[j - c[i] * k] + w[i] * k);
}
}
}
板子题1
ACcode
#include<bits/stdc++.h>
using namespace std;
const int M = 2e3 + 9;
int c[M], w[M], p[M], dp[M];
int main()
{
int n, v;cin >> n >> v;
for (int i = 1;i <= n;i++)cin >> c[i] >> w[i] >> p[i];
for (int i = 1;i <= n;i++) {
int num = min(p[i], v / c[i]);
for (int k = 1;num > 0;k <<= 1) {
if (k > num)k = num;
num -= k;
for (int j = v;j >= c[i] * k;j--) {
dp[j] = max(dp[j], dp[j - c[i] * k] + w[i] * k);
}
}
}
cout << dp[v];
return 0;
}
板子题2
ACcode
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 9;
int dp[M], c[M], w[M], p[M];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, v;cin >> n >> v;
for (int i = 1;i <= n;i++)cin >> w[i] >> c[i] >> p[i];
for (int i = 1;i <= n;i++) {
int num = min(p[i], v / c[i]);
for (int k = 1;num > 0;k <<= 1) {
if (k > num)k = num;
num -= k;
for (int j = v;j >= c[i] * k;j--) {
dp[j] = max(dp[j], dp[j - c[i] * k] + w[i] * k);
}
}
}
cout << dp[v];
return 0;
}