P1441 砝码称重 状压+bitset的组合
Posted Willette
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1441 砝码称重 状压+bitset的组合相关的知识,希望对你有一定的参考价值。
这道题最妙的是移入bitset,来统计能组成那些数
令bitset<2010> S;
一开始初始化S[0]=1
对于w[i],S<<w[i]表示原本能组成的数加上w[i]后组成的新数
但原本的数我们依旧是要的,所以便是S=S|(S<<w[i])
S.count返回S中1的个数,但是无符号的数据类型要转int,注意要减去(S[0]=1)这种不合法情况
Code:
#include<bits/stdc++.h> using namespace std; #define ll long long #define mp make_pair #define pb push_back #define popb pop_back #define fi first #define se second const int N=30; //const int M=; //const int inf=0x3f3f3f3f; //const ll INF=0x3ffffffffffff; int T,n,m,w[N]; inline int read() int x=0,f=1;char ch=getchar(); while(ch<\'0\'||ch>\'9\')if(ch==\'-\')f=-1;ch=getchar(); while(ch>=\'0\'&&ch<=\'9\')x=(x<<1)+(x<<3)+(ch^48);ch=getchar(); return x*f; int main() // freopen("","r",stdin); // freopen("","w",stdout); n=read(),m=read(); for(int i=0;i<=n-1;i++) w[i]=read(); int ans=0; for(int i=0;i<(1<<n);i++) if(__builtin_popcount(i)==n-m) bitset<2010> S; S[0]=1; for(int j=0;j<=n-1;j++) if(i&(1<<j)) S=S|(S<<w[j]); ans=max(ans,(int)S.count()); printf("%d",ans-1); return 0;
以上是关于P1441 砝码称重 状压+bitset的组合的主要内容,如果未能解决你的问题,请参考以下文章