基本01背包

01背包问题是一种动态规划问题:
给定 n 个物品,每个物品有重量 w[i] 和价值 v[i ] ,以及一个容量为 X 的背包。要求在不超过背包容量的前提下,选择物品使得总价值最大。(每个物品只能选择一次或不选)
解法:

  • 定义一个 dp 数组,设 dp[i][j] 表示前 i 个物品中,容量为 j 的背包能装的最大价值。
    状态转移方程(核心点)

  • 如果不选第 i 个物品, dp[i][j] = dp[i - 1][j]

  • 如果选择第 i 个物品,dp[i][j] = dp[i - 1][j - w[i]] - v[i]

综合以上来看,若想要求出最大值,则:

  • dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] - v[i])

废话不多说,代码模板:

#include<bits/stdc++.h>
using namespace std;
int dp[][];
//定义dp数组 
int n, x;
//初始化 
int w[];
//存储质量  
int v[]; 
//存储价值 
int main(){
	//输入
	for(int i = 1;i <= n;i++){//遍历前i个物品 
		for(int i = 1;i <= x;i++){//遍历质量 
			if(j < w[i]){//如果这些载质量不够装这个物品 
				dp[i][j] = dp[i - 1][j];//就只能不装  
				continue;
			}
			dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);//状态转移方程  
		}
	} 
	cout << dp[n][x];
	//输出答案(从前n个物品选择,载质量为x) 
	return 0;
}
1 个赞

不是。。。直接连发?

1 个赞

第一个是我昨天写好的

1 个赞

\LaTeX 下数组不是 a[i] 而是 a_i ,源码:a_i

2 个赞

dp[i][j] 则是dp_{i,j},效果 dp_{i,j}

1 个赞

\LaTeX 大佬

1 个赞

2024.11.06 进入智灵普及

没有进智灵提高吗

1 个赞

e,没写(居然还有人看我主页啊)

1 个赞

当辉煌的表面褪下后,留下的只有着屈辱的过往。
<有罪史>
2024.8.17左右 封禁两次
2024.10.26 string dp[100005] 事件
2024.11.24 封禁,并正好错过生日(11.30 生日,12.1 解封)
2025.2.20左右 点赞量下降近100

但是,正由此,才有了新鲜的外表。

2024.8.9 进入论坛
2024.8.12左右 晋升成员
2024.11.02 进入智灵普及
2025.3.01 进入智灵提高

致 往年自己。

2 个赞

666,补药水贴

1 个赞