背包问题模板

约定物品个数为n,总空间为m,每种物品所占体积为v[i],价值为w[i],个数为num[i],一组内物品为kind[i]

01背包:

for(int i = 1; i <= n; i++){
	for(int j = m; j >= 0; j--){
		if(j >= v[i]){
			dp[j] = max(dp[j],dp[j -v[i]] + w[i]);
		}
	}
} 

完全背包:

for(int i = 1; i <= n; i++){
	for(int j = v[i]; j <= m; j++){
		dp[j] = max(dp[j],dp[j -v[i]] + w[i]);
	}
} 

多重背包:

for(int i = 1; i <= n; i++){
	for(int j = 1; j <= num[i]; j++){
		for(int k = v[i]; k <= m; k++){
			dp[j] = max(dp[j],dp[j - v[i]] + w[i]);
		}
	}
} 

分组背包;

for(int i = 1; i <= n; i++){
	for(int j = 1; j <= num[i]; j++){
		for(int k = m; k >= v[kind[j]]; k++){
			dp[j] = max(dp[j],dp[j - v[i]] + w[i]);
		}
	}
} 
posted @ 2022-07-17 19:58  腾云今天首飞了吗  阅读(21)  评论(0)    收藏  举报