智乃买瓜(多重背包)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智乃买瓜(多重背包)相关的知识,希望对你有一定的参考价值。

题目连接

https://ac.nowcoder.com/acm/contest/23478/B

题面

思路

我们这里将半块瓜看成一件物品,那么对于每一件物品我们有三种选择方式

  • 不选
  • 选一个
  • 选两个
    那么我们直接套一个01背包即可
    状态转移方程为:
    f [ i ] [ j ] = f [ i − 1 ] [ j ] + f [ i − 1 ] [ j − a [ i ] ] + f [ i − 1 ] [ j − a [ i ] ∗ 2 ] f[i][j] =f[i-1][j] + f[i-1][j-a[i]] + f[i-1][j-a[i]*2] f[i][j]=f[i1][j]+f[i1][ja[i]]+f[i1][ja[i]2]
    只不过要注意一点就是背包容量不能越界,当然这里也能通过滚动数组优化

代码

#include<bits/stdc++.h>
using namespace std;
//----------------�Զ��岿��----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>

int dx[4]=0,-1,0,1,dy[4]=-1,0,1,0;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 1e3+10;
//----------------�Զ��岿��----------------
ll n,m,q,a[N],f[N][N];

int main()

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	cin>>n>>m;
	for(int i = 1;i <= n; ++i) 
		cin>>a[i];
		a[i]/=2;
	
	f[0][0] = 1;
	for(int i = 1; i <= n; ++i)
	
		for(int j = 0;j <= m; ++j) 
			f[i][j] = (f[i][j] + f[i-1][j]) % mod;
			if(j >= a[i])
				f[i][j] = (f[i][j] + f[i-1][j-a[i]]) % mod;
			if(j >= 2 * a[i])
				f[i][j] = (f[i][j] + f[i-1][j-a[i] * 2]) % mod;
		
	
	for(int i = 1;i <= m; ++i) 
		cout<<f[n][i]<<" \\n"[i==m];
	
	return 0;


以上是关于智乃买瓜(多重背包)的主要内容,如果未能解决你的问题,请参考以下文章

2022牛客寒假算法基础集训营3全部题解

2022牛客寒假算法基础集训营3题解 BCEFGHIJK

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

多重背包

背包整理(01背包,完全背包,多重背包,分组背包)(待更新)