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的组合的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1441状压DP砝码称重

luogu P1441状压DP砝码称重

状压DP砝码称重

P1441 砝码称重

状压DP砝码称重

状压DP砝码称重