P1537 弹珠 (多重背包)

原题链接:弹珠 - 洛谷

 看一个人能不能凑出sum / 2就可以了

多重背包

AC代码:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define PII pair<int,int>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define rrep(i, n) for(int i = n; i >= 1; ++i)

using namespace std;

const double pi = acos(-1.0);

const int N = 6e4 + 10;
int a[7], f[N];

int main()
{
    int cnt = 0;
    f[0] = 1;
    while(cin >> a[1] >> a[2] >> a[3] >> a[4] >> a[5] >> a[6])
    {
        cnt++;
        int sum = 0;
        rep(i, 6) sum += a[i] * i;
        if(!sum) break;
        cout<<"Collection #"<<cnt<<":\n";
        if(sum % 2)
        {
            cout<<"Can't be divided.\n\n";
            continue;
        }
        sum /= 2;
        rep(i, sum) f[i] = 0;
        for(int i = 1; i <= 6; i++)
            for(int j = sum; j > 0; j--)
              for(int k = 1; k <= a[i] && i * k <= j; k++)
                  f[j] |= f[j - k * i];
        if(f[sum]) cout<<"Can be divided.\n";
        else cout<<"Can't be divided.\n";
        cout<<'\n';
    }
    return 0;
}

 参考:洛谷P1537 弹珠【多重背包DP】【绿】_一个老实的人的博客-优快云博客_多重背包 洛谷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值