题解 | #【模板】完全背包#

【模板】完全背包

https://ac.nowcoder.com/acm/problem/226516

完全背包问题,对于第一问,直接再01背包的基础上的内层循环反过来就行,没有过多描述

接下来是对于第二问,我们首先假设前面的有值或者从0转移过来进行转移,这样可以就可以保证这个背包一定是装满的,原理如下:对于开始0处进行转移直接加入就行,假设当前的体积为j,如果vis[j - a[i]]的结果不为0,说明前面的这个数值(j - a[i])一定是可以装满的,我们现在是在装满的基础上进行转移,这样转移后得到的结果一定是装满的情况

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

void solve()
{
	int n,v;cin>>n>>v;
	int f[v+1];
	int vis[v+1];
	vector<int> a(n+1);
	vector<int> b(n+1);
	for(int i=1;i<=n;i++)
		cin>>a[i]>>b[i];
	memset(f,0,sizeof f);
	memset(vis,0,sizeof vis);
	vis[0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=a[i];j<=v;j++)
		{
			f[j]=max(f[j],f[j-a[i]]+b[i]);
			if(vis[j-a[i]])
			{
				if(j-a[i] == 0)
					vis[j] = max(vis[j],b[i]);
				else
				{
					vis[j] = max(vis[j],vis[j-a[i]]+b[i]);
				}
			}
		}
	}
	cout<<f[v]<<'\n';
	cout<<vis[v];
}

signed main()
{
	int t = 1;
//	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

全部评论
为什么vis[0] =1
点赞 回复 分享
发布于 2024-11-24 22:21 山东

相关推荐

书海为家:实习是成为大厂正式员工很好的敲门砖,看您的简历中有一段实习经历,挺好的。我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己实习时做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务