状压+bitset大法

洛谷P1441 砝码称重

思路来自pantw大佬
主要思路
b=b|b<<a[j];
首先b的第i位为1表示能够表示出重量为i的物品。b<<a[j]表示 b+a[j]的物品可以表示出来。
如b初始为000011,表示b能表示重量为1和重量为0的物品(最右边表示第0位),此时砝码加上一个重量为2的物品,则b为001111,第0,1,2,3位都为1表示重量为1,2,3都能表示出来。
代码如下:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define ll long long
int n,m;
int a[30];
int num(int x)
{
    int ans=0;
    for(int i=0;i<=n-1;i++)
    {
        if(x>>i&1)
         ans++;

    }
    return ans;

}

void solve()
{
   int ans=0;
   for(int s=0;s<=(1<<n)-1;s++)
   {
       if(num(s)==n-m)
       {
       bitset<2010>b;
       b[0]=1;
       for(int j=1;j<=n;j++)
       {
         if(s>>(j-1)&1)
         {
          b=b|b<<a[j];
         }
       }
       int x=b.count();
       ans=max(ans,x);
       }
   }

    cout<<ans-1;


}
signed main()
{
     cin.tie(NULL);
     cout.tie(nullptr);
     ios_base::sync_with_stdio(false);

      cin>>n>>m;
      for(int i=1;i<=n;i++)
        cin>>a[i];
        solve();




     return 0;
}

posted @ 2024-01-28 18:07  WandW  阅读(31)  评论(0)    收藏  举报