状压+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;
}

浙公网安备 33010602011771号