试题 历届真题 砝码称重【第十二届】【省赛】【B组】

https://blog.csdn.net/weixin_51176105/article/details/120300204 可谓之01背包变种 注意此处其实是在赋值false true

#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int N =2e5+20;
ll n,m,k;
struct cmp {
	bool operator()(const int&a,const int&b) const {
		return a>b;
	}
};
int P = N/2; 
bool dp[105][200010];
int w[105];
ll sum =0;
int main() {
	cin >> n;
	for(int i =1;i<=n;i++)
	{
		cin >>w[i];
		sum+=w[i];
	}
	memset(dp,0,sizeof(dp));
	dp[0][P]=1;
	for(int i =1;i<=n;i++){
		for(int j =-sum;j<=sum;j++){
			dp[i][j+P]=dp[i-1][j+P];
			if(j-w[i]>=-sum) dp[i][j+P]|=dp[i-1][j+P-w[i]];
			if(j+w[i]<=sum) dp[i][j+P]|=dp[i-1][j+P+w[i]];
			//if(j-w[i]>=-sum) dp[i][j+P]=max(dp[i][j+P],dp[i-1][j+P-w[i]]);
			//if(j+w[i]<=sum) dp[i][j+P]=max(dp[i][j+P],dp[i-1][j+P+w[i]]);
		}
	}
	int ans = 0;
	for(int i =1;i<=sum;i++){
		if(dp[n][i+P]) ans++;
	}
	cout <<ans;
	return 0;
}
//3
//1 4 6
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 13:47
机械打工仔:你自己匿名可以,这么好的公司就别给它匿名了
点赞 评论 收藏
分享
05-19 15:21
已编辑
门头沟学院 Java
白火同学:你才沟通了200,说实话,北上广深杭这里面你连一座城市的互联网公司都没投满呢,更别说还有各种准一线二线城市了。等你沟通突破了三位数,还没结果再考虑转行的事吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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