时间复杂度变为O(wlogk) k为背包的总数
code
20行的while 改成 k - c >= 0也不会有影响,相当于可能会增加几个没有重量和价值的空背包。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <unordered_map>
using namespace std;
using ll = long long;
const int N = 3e5 + 10;
int f[N], weight[N], val[N];
int n, W, cnt;
int main(int argc, char const *argv[]){
scanf("%d%d", &n, &W);
int v, w, k;
for (int i = 0; i < n; ++i)
{
scanf("%d%d%d", &v, &w, &k);
int c = 1;
while(k - c > 0){
k -= c;
weight[++cnt] = c * w;
val[cnt] = c * v;
c <<= 1;
}
weight[++cnt] = k * w;
val[cnt] = k * v;
}
for (int i = 1; i <= cnt; ++i)
{
for (int l = W; l >= weight[i]; --l)
{
f[l] = max(f[l], f[l - weight[i]] + val[i]);
}
}
printf("%d\n",f[W]);
return 0;
}