多重背包(二进制优化)

原题地址

#include<cstdio>
#include<iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[10],dp[300000];
int main()
{
    int k=1;
    while(1)
    {
        memset(dp,0,sizeof(dp));
        int flag=1,sum=0;
        for(int i=1;i<=6;i++)
        {
            scanf("%d",&a[i]);
            sum+=i*a[i];
            if(a[i]) flag=0;
        }
        if(flag) break;
        printf("Collection #%d:\n",k++);
        if(sum&1)
        {
            cout<<"Can't be divided."<<endl<<endl;
            continue;
        }
        int t=sum/2;
        for(int i=1;i<=6;i++)
        {
            for(int j=1;j<=a[i];j<<=1)
            {
                int cnt=i*j;
                for(int k=t;k>=cnt;k--)
                {
                    dp[k]=max(dp[k],dp[k-cnt]+cnt);
                }
                a[i]-=j;
            }
            if(a[i])
            {
                int cnt=i*a[i];
                for(int k=t;k>=cnt;k--)
                {
                    dp[k]=max(dp[k],dp[k-cnt]+cnt);
                }
            }
        }
        if(dp[t]==t) cout<<"Can be divided."<<endl;
        else cout<<"Can't be divided."<<endl;
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40634175/article/details/88782904