首页 > 其他分享 >AcWing 4. 多重背包问题

AcWing 4. 多重背包问题

时间:2023-12-04 11:14:10浏览次数:25  
标签:多重 背包 int 01 物品 AcWing

题面:
有 \(N\) 件物品和一个容量是 \(V\) 的背包。
第 \(i\) 件物品最多有 \(s_i\) 件,每件体积是 \(v_i\),价值是 \(w_i\)。
求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大
输出最大价值。

原题链接:4. 多重背包问题 I - AcWing

多重背包实际上沿袭于01背包[1]

\(s\) 件 \(i\) 物品可以转换为 \(s\) 个01背包问题,即是否取第 s 个 i 物品

#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
int v[N], w[N], s[N];
int f[N];

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> v[i] >> w[i] >> s[i];
	for (int i = 1; i <= n; i++)
		for (int j = m; j >= 0; j--)    //01背包变体,逆序遍历保证不被错误更新
		    //k值即代表着取k件i物品,需保证k不超过总数s,且总体积不超过容量j
			for (int k = 1; k <= s[i] && k * v[i] <= j; k++)
				f[j] = max(f[j], f[j - k * v[i]] + k * w[i]);
	cout << f[m];
}

在进主循环前先将多重背包拆为01背包

题解来源:AcWing 4. 多包 I(一看就会,懒人专用)+saber精简代码 - 9年级的蒟蒻

#include <bits/stdc++.h>
using namespace std;

const int N = 110;
int v[N], w[N], s[N], f[N];

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> v[i] >> w[i] >> s[i];
		while (s[i]--)  //直接把s*i拆分成s个i
			for (int j = m; j >= v[i]; j--)
				f[j] = max(f[j], f[j - v[i]] + w[i]);
	}
	cout << f[m];
}

  1. https://www.acwing.com/solution/content/3988/ ↩︎

标签:多重,背包,int,01,物品,AcWing
From: https://www.cnblogs.com/haruhomu/p/17874449.html

相关文章

  • AcWing 5. 多重背包问题 II
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:5.多重背包问题II-AcWing先前的思路[1]:将......
  • AcWing 3. 完全背包问题
    题面:有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用。第\(i\)种物品的体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原题链接:3.完全背包问题-AcWing根据01背包的思路扩......
  • AcWing 2. 01背包问题
    题面:有 \(N\) 件物品和一个容量是 \(V\) 的背包。每件物品只能使用一次。第 \(i\) 件物品的体积是 \(v_i\),价值是 \(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原链接:2.01背包问题-AcWing有限集的最优问......
  • Acwing第132场周赛
    AcWing5366.大小写转换#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,int>#definelllonglong#definedbdouble#defineullunsignedlonglong#defineendl'\n'#defineioios::sync_with_......
  • 前缀和/差分——acwing算法基础课笔记
    个人笔记,欢迎补充,指正。一维前缀和对于数组:a[1],a[2],a[3]...a[n];其前缀和数组为s[i]=a[1]+a[2]+...+a[i];下标必须从1开始求前缀和1for(inti=1;i<n;++i)2s[i]=s[i-1]+a[i];s[0]需要定义为0作用求原数组里一段数(l,r)的和......
  • 背包问题
    先聊聊区分贪心和01背包背包问题:有多个物品,重量不同、价值不同,以及一个容量有限的背包,选择一些物品装到背包中,问怎么裝才能使装进背包的物品总价值最大。根据不同的限定条件,可以把背包问题分为很多种,常见的有下面两种:(1)如果每个物体可以切分。称为一般背包问题,用贪心法求......
  • Acwing.第132场周赛
    Acwing.第132场周赛比赛地址A.大小写转换题目思路:简单的模拟,可以使用c++大小写转换库函数,但是由于我早上比赛时候没用好就不敢用了就用了ASCII码转换代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; for(inti=0;i<s.size();i++)......
  • 【AcWing-Linux】03. Shell
    Shell一、Shell简介shell是我们通过命令行与操作系统沟通的语言。shell是一种脚本语言,通过对应的脚本解释器解释执行,一般作为内置于操作系统的应用程序向用户提供访问操作系统内核的服务。shell脚本(shellscript)可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复......
  • 代码随性训练营第四十六天(Python)| 139.单词拆分 、多重背包
    139.单词拆分classSolution:defwordBreak(self,s:str,wordDict:List[str])->bool:dp=[False]*(len(s)+1)dp[0]=True#求排列先遍历背包再遍历物品foriinrange(len(s)+1):forjinrange(i):......
  • 代码随想训练营第四十四天(Python)| 完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ
    [完全背包]有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。1、先遍历物品再遍历背包defall_bag(weight,value,bag_weight):dp=[0]*......