背包大全
这是完全背包模板
一样东西可以使用无限次,那么,压缩成一维的 \(dp[j]\) 就不用再倒序避免重复使用
for(int i = 1; i <= n; i++){
for(int j = c[i]; j <= m; j++){
dp[j] = min(dp[j], dp[j - c[i]] + v[i]);
}
}
这是多重背包模板
采用二进制优化 ------ 2026/1/26
变量定义:
int n, cnt, c[N], v[N], nc[N], nv[N];
int num[N]; // num[i] 为数量
实现
for(int i = 1; i <= n; i++){
for(int j = 0; j < 30; j++){
int tmpcnt = (1 << j);
if(num[i] >= tmpcnt){
num[i] -= tmpcnt;
nc[++cnt] = c[i] * tmpcnt;
nv[cnt] = v[i] * tmpcnt;
}
}
if(num[i] > 0){
nc[++cnt] = c[i] * num[i];
nv[cnt] = v[i] * num[i];
}
}

浙公网安备 33010602011771号