首页 > 其他分享 >背包

背包

时间:2024-09-05 21:36:29浏览次数:3  
标签:202 val int 背包 10010 dp

01 背包

\(n\) 件物品,每件物品有权值和重量,给出背包体积 \(V\),从这些物品中挑选若干件(只能选一次)放入背包,使得背包内物品的总重量不超过 \(V\),问能可以得到的最大权值。

设 \(dp[i][j]\) 选取前 \(i\) 件物品重量为 \(j\) 能取得的最大的权值,可以得到转移方程 \(dp[i][j]=max(dp[i-1][j-w[i]]+val[i],dp[i-1][j]);\)

因为 i 只与 i-1 有关所以考虑滚动数组:

交替滚动

用 now 表示现在的数组,用 old 表示上一个数组,交替使用。

#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int t,m;
int w[202],val[202];
int dp[3][10010];

int main(){
	ios::sync_with_stdio(false);
	cin>>t>>m;
	for(int i=1;i<=m;i++){
		cin>>w[i]>>val[i];
	}
	int now=0,old=1;
	for(int i=1;i<=m;i++){
		swap(old,now);
		for(int j=0;j<=t;j++){
			if(j>=w[i]){
				dp[now][j]=max(dp[old][j],dp[old][j-w[i]]+val[i]);
			}
			else{
				dp[now][j]=dp[old][j];
			}
		}
	}
	cout<<dp[now][t];
    return 0;
}

自我滚动

因为体积只会向小减少,所以从后向前遍历容量以确保每个数物品只选一次,上一次的数组储存的数(i-1) 结果全部就在这个数组里,这样空间压缩到一维。

#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int t,m;
int w[202],val[202];
int dp[10010];

int main(){
	ios::sync_with_stdio(false);
	cin>>t>>m;
	for(int i=1;i<=m;i++){
		cin>>w[i]>>val[i];
	}
	for(int i=1;i<=m;i++){
		for(int j=t;j>=w[i];j--){
			dp[j]=max(dp[j],dp[j-w[i]]+val[i]);
		}
	}
	cout<<dp[t];
    return 0;
}

完全背包

\(n\) 件物品,每件物品有权值和重量,给出背包体积 \(V\),从这些物品中挑选若干件(可以多次同选一个)放入背包,使得背包内物品的总重量不超过 \(V\),问能可以得到的最大权值。

我们对 01 背包的代码进行更改为从小到大枚举容量,因为在计算某个容量时,可以确保之前计算的状态已经包含了该物品之前选择的次数,这样就能够正确地累积多个相同物品的价值。

#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int t,m;
int w[202],val[202];
int dp[10010];

int main(){
	ios::sync_with_stdio(false);
	cin>>t>>m;
	for(int i=1;i<=m;i++){
		cin>>w[i]>>val[i];
	}
	for(int i=1;i<=m;i++){
		for(int j=w[i];j<=t;j++){
			dp[j]=max(dp[j],dp[j-w[i]]+val[i]);
		}
	}
	cout<<dp[t];
    return 0;
}

标签:202,val,int,背包,10010,dp
From: https://www.cnblogs.com/sadlin/p/18399265

相关文章

  • NOIP2024集训Day21 DP常见模型2 - 背包
    NOIP2024集训Day21DP常见模型2-背包A.[BZOJ4987]Tree树形背包dp先考虑几个显而易见的性质:选出的点一定是相邻的对于选出的点,如果从\(a_k\)再走回\(a_1\),那么就相当于每条边经过了两次由于题目没有包含\(dis(a_k,a_1)\),因此就相当于选出的点中的一条链可以只......
  • 每日一题 背包,dp,兵营力量训练
    首先,读完这题我一开始有点懵,分析了条件后还是不知道怎么分配比较完美,一开始想一直给最小的那个分配呗,但这不知道分配的力量是多少,没有一个界线,所以要找一个界线,最后还是看了别人的参考答案,用二分确定会变的界线,然后bool数组检查有没有达到界线,没达到的都分配力量,分配的力量......
  • 回溯法-0/1背包问题
    什么是回溯法?回溯法是一种搜索算法,它通过深度优先搜索的方式来解决决策问题。它从根节点开始,逐步扩展节点,直到找到所有可能的解。回溯法的基本思想开始节点:从根节点出发,这个节点是解空间的起点。扩展节点:在当前节点上,选择一个方向继续搜索,这个方向会形成一个新的节点。活......
  • 多重背包问题 模板 C++实现
    问题:有n 种物品和一个容量是c 的背包。第i种物品最多有num[i-1] 件,每件体积是weight[i-1],价值是value[i-1]。求解将哪些物品装入背包,可使物品重量总和不超过背包容量,且价值总和最大。输出最大价值。算法1:三重循环内层循环用于考虑当前物品i可......
  • LOJ #6089. 小 Y 的背包计数问题 题解
    Description小Y有一个大小为\(n\)的背包,并且小Y有\(n\)种物品。对于第\(i\)种物品,共有\(i\)个可以使用,并且对于每一个\(i\)物品,体积均为\(i\)。求小Y把该背包装满的方案数为多少,答案对于\(23333333\)取模。定义两种不同的方案为:当且仅当至少存在一种物品的......
  • 常用背包dp模板(未完待续)
    部分板子优化中...你好哇,我是flypig114代码里有各部分及变量数组的注释,so...不多废话,直接上正题!01背包无优化#include<bits/stdc++.h>usingnamespacestd;#definellint//为了方便修改类型constllN=1000;//辅助定义数组lln,m;//n是背包容量m是物品数量llv[N],......
  • 算法-动态规划-完全背包
    0.动态规划五部曲:确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组1.完全背包问题完全背包问题中,每个物品都有无数个,可以重复选择。二维dp数组int[][]dp=newint[n][totalWeight+1];for(inti=0;i<n;++i){fo......
  • LOJ #160. 树形背包 题解
    Description有\(N\)个物品,编号分别为\(1\ldotsN\)。物品\(i\)的重量为\(w_i\),价值为\(v_i\)。给出每个物品依赖于哪个物品。我们用\(d_i=j\(i>j>0)\)表示:如果要选取物品\(i\),就必须先选取物品\(j\)。另外,我们用\(d_i=0(i>0)\)表示:该物品不依赖于任何物品。......
  • 完全背包问题
    完全背包问题有N种物品和一个容量是V的背包,每种物品都有无限件可用。第i种物品的体积是vi,价值是wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接......
  • MATLAB智能优化算法-学习笔记(1)——遗传算法求解0-1背包问题【过程+代码】
    一、问题描述(1)数学模型(2)模型总结目标函数:最大化背包中的总价值Z。约束条件:确保背包中的物品总重量不超过容量W。决策变量:每个物品是否放入背包,用0或1表示。这个数学模型是一个典型的0-1整数线性规划问题。由于其NP完全性,当问题规模较大时,求解此问题通常需要使用启发......