题目
N(N<100)个数,第i个数为wi(wi<=1e4)
问能否将这N个数的和分成两半
思路来源
https://code.mi.com/submit/list/view?id=98641
题解
写了个01背包莽sum/2,O(n*n*sum/2)跑到5e7能卡过
感觉bitset的写法更好,之前写过类似的但是不记得了
dp练得还是少,忘得还是快,最基础的都不会
代码
#include<iostream>
#include<cstring>
#include<bitset>
using namespace std;
const int maxn=1e6+10;
int dp[maxn],len;
int a[105],cnt,now,sum;
char s[1005];
bitset<1000005>ans;
bool solve()
{
if(sum&1)return 0;
sum/=2;
ans.reset();
ans[0]=1;
for(int i=0;i<cnt;++i)
ans|=(ans<<a[i]);
return ans[sum]==1;
}
int main()
{
while(~scanf("%s",s))
{
memset(dp,0,sizeof dp);
cnt=now=sum=0;
len=strlen(s);
s[len]=',';
for(int i=0;i<=len;++i)
{
if(s[i]==',')
{
a[cnt++]=now;
sum+=now;
now=0;
}
else now=now*10+(s[i]-'0');
}
puts(solve()?"true":"false");
}
return 0;
}