【洛谷 P1441】 【状压】 砝码称重
题目
解题思路
用二进制表示选了哪些砝码
用bitset统计有多少种质量可称量
代码
#include<iostream>
#include<cstdio>
#include<bitset>
using namespace std;
bitset<2001> s; //类似数组,但只能存0或1
int n,m,z,a[30],ans,w[3000100];
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
z=1<<n;
for (int i=1;i<z;i++)
{
w[i]=w[i-(i & -i)]+1; //i & -i求的是最右边的第一个1,w记录这个状态包含几个砝码
if (w[i]==n-m) //符合删去m个砝码
{
s.reset(); //清空
s[0]=1;
for (int j=1;j<=n;j++)
if (i&(1<<(j-1)))
s=s | (s<<a[j]);
ans=max(ans,(int)s.count());
}
}
printf("%d",ans-1);
return 0;
}