P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解

P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解

显然P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解,考虑如何进行P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解

设状态转移数组P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解表示在前P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解个砝码中,有没有组成重量为P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解的方案。

考虑转移情况,每个状态可以由:

  • P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解个选了砝码P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解在异侧

  • P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解个选了砝码P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解在同侧

  • 未选砝码P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解

    转移而来

则转移方程式为
P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解
由于可能会出现P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解在运算过程中小于零的情况,所以要将P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解整体右移(加上一个大数)

时间复杂度P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解P8742 [蓝桥杯 2021 省 AB] 砝码称重 题解为值域),可以通过本题

空间复杂度超标,需要使用滚动数组。

标程:

#include<bits/stdc++.h>
#define ll long long
#define M 200005
#define inf 1000000007
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
int n,w[105],f[2][2*M],sm;
ll ans;
int read(){
	int res=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'&&((ch=getchar())>='0'&&(ch)<='9')) f=-1;
		else ch=getchar();
	}
	while(ch>='0'&&ch<='9')res=res*10+ch-'0',ch=getchar();
	return res*f;
}
int main(){
	n=read();
	fo(i,1,n)w[i]=read();
	f[0][M]=1;
	fo(i,1,n){
		sm+=w[i];
		fo(j,-sm,sm){
			f[i&1][j+M]=f[(i-1)&1][j+M-w[i]]|f[(i-1)&1][j+M+w[i]]|f[(i-1)&1][j+M];
		}
	}
	fo(i,1,sm){
		if(f[n&1][i+M])++ans;
	}
	printf("%lld",ans);
}



版权声明:本文为博主作者:_Falling_stars_原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/StevenWang2019/article/details/127904783

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2024年1月6日
下一篇 2024年1月6日

相关推荐