for (int i = 1; i <= n; i++)
for (int j = m; j >= 0; j--)
for (int k = 0; k <= s[i] && k * v[i] <= j; k++)
dp[j] = max(dp[j], dp[j - k * v[i]] + k * w[i]);
优化二(转化为01背包和完全背包)
for (int i = 1; i <= n; i++) {
if (s[i] * v[i] >= m) { // 转化为完全背包问题
for (int j = v[i]; j <= m; j++)
dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
}
else { // 转化为01背包问题
for (int j = m; j >= v[i]; j--)
for (int k = 0; k <= s[i] && k * v[i] <= j; k++)
dp[j] = max(dp[j], dp[j - k * v[i]] + k * w[i]);
}
}
优化三(二进制优化)
int cnt = 0;
// 拆分s[i]
for (int i = 1; i <= n; i++) {
int k = 1;
while (k <= s) {
v[++cnt] = k * v[i];
w[cnt] = k * w[i];
s[i] -= k;
k *= 2;
}
if (s[i]) {
v[++cnt] = s[i] * v[i];
w[cnt] = s[i] * w[i];
}
}
// 转化为01背包
for (int i = 1; i <= cnt; i++)
for (int j = m; j >= v[i]; j--)
dp[j] = max(dp[j], dp[j - v[i]] + w[i]);