背包大全

这是完全背包模板

一样东西可以使用无限次,那么,压缩成一维的 \(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];
	}
}
posted @ 2026-01-27 15:42  9102700  阅读(0)  评论(0)    收藏  举报