dp背包模板(01、完全、多重)

这篇博客介绍了背包问题的三种模板:01背包、完全背包和多重背包。01背包中,状态转移方程是dp[j]=max(dp[j], dp[j-w[i]]+v[i]),内层循环逆序;完全背包允许每种物品无限次选取,状态转移方程相同,但循环顺序;多重背包针对每种物品有限件数的情况,需要额外数组记录件数,循环变为三层,可通过二进制优化。" 127580868,16053094,使用Substance Designer创建风格化瓦片材质,"['材质制作', 'Substance Designer', '3D材质', '风格化设计', '程序化纹理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背包模板

01背包

  • dp[j]记录当容量为j时的可行取法的最大价值
  • 状态转移方程dp[j]=max(dp[j],dp[j-w[i]]+v[i])
  • 注意内层循环为逆序
#include<stdio.h>
int dp[1005];
int main() {
   
	int T,n,i,j,s,v[1005],w[1005];
	scanf("%d", &T);//循环次数
	while (T--) {
   
	//商品件数、背包容量
		scanf("%d %d", &n, &s);
		//初始化
		for (i = 0; i <= n; i++) {
   
				dp[i]=0;	
				v[i]=0;
				w[i]=0;
		}
		//价值、重量
		for (i = 1; i <= n; i++) {
   
			scanf("%d %d", &v[i],&w[i]);
		}
		for (i = 1; i <= n; i++) {
   
			for (j = s; j >= 0; j--) {
   
			//商品重量大于现在背包容量
				if (w[i]>j)
					dp[j] = dp[j];
			//能装,看哪个大,选择装还是不装
				else{
   
					int value1 = dp[j-w[i]]+v[i];
					int value2 = dp[j];
					if(value1>value2)
						dp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值