HDU
多重背包+二进制 板子
#include<bits/stdc++.h>
using namespace std;
int dp[130000];
int mp[10];
struct Good
{
int v;
int w;
} ;
int main()
{
int cas=0;
while(1)
{
vector<Good>goods;
int sum=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=6;i++) scanf("%d",&mp[i]);
for(int i=1;i<=6;i++) sum+=mp[i]*i;
if(sum==0) return 0;
printf("Collection #%d:\n",++cas);
if(sum%2)
{
printf("Can't be divided.\n\n"); continue;
}
sum/=2;
for(int i=1;i<=6;i++)
{
for(int j=1;j<=mp[i];j<<=1)
{
mp[i]-=j;
goods.push_back({j*i,j*i});
}
if(mp[i]>0)
{
goods.push_back({mp[i]*i,mp[i]*i});
}
}
for(auto good:goods)
{
for(int j=sum;j>=good.w;j--)
{
dp[j]=max(dp[j],dp[j-good.w]+good.v);
}
}
if(dp[sum]==sum)
{
printf("Can be divided.\n\n");
}else
{
printf("Can't be divided.\n\n");
}
}
}
#include<bits/stdc++.h>
using namespace std;
int dp[120000];
int d[120000];
int mp[10];
int main()
{
int cas=0;
while(1)
{
int sum=0;
for(int i=1;i<=6;i++)
{
scanf("%d",&mp[i]);
sum+=mp[i]*i;
}
if(sum==0) return 0;
printf("Collection #%d:\n",++cas);
if(sum%2)
{
printf("Can't be divided.\n\n"); continue;
}
sum/=2;int tot=0;
for(int i=1;i<=6;i++)
{
for(int j=1;j<=mp[i];j<<=1)
{
mp[i]-=j;
d[tot++]=j*i;
}
if(mp[i]>0)
{
d[tot++]=mp[i]*i;
}
}
memset(dp,0,sizeof(dp));
for(int i=0;i<tot;i++)
{
for(int j=sum;j>=d[i];j--)
{
dp[j]=max(dp[j],dp[j-d[i]]+d[i]);
}
}
if(dp[sum]==sum)
{
printf("Can be divided.\n\n");
}else
{
printf("Can't be divided.\n\n");
}
}
}