ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

智乃买瓜(多重背包)

2022-02-05 14:33:04  阅读:164  来源: 互联网

标签:---------------- 多重 背包 int ll ans define 智乃买瓜 mod


题目连接

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[i−1][j]+f[i−1][j−a[i]]+f[i−1][j−a[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;
}

标签:----------------,多重,背包,int,ll,ans,define,智乃买瓜,mod
来源: https://blog.csdn.net/m0_46201544/article/details/122790042

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有