【多重背包】B001_AW_划分大理石(二进制优化 / 贪心+dp)

有价值分别为1..6的大理石各a[1..6]块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现。

其中大理石的总数不超过20000。

输入格式
输入包含多组数据!
每组数据占一行,包含6个整数,表示a[1]~a[6]。
当输入为0 0 0 0 0 0时表示输入结束,且该行无需考虑。
输出格式
每组数据输出一个结果,每个结果占一行。
如果可以实现则输出“Can”,否则输出“Can’t”

输入样例:
4 7 4 5 9 1
9 8 1 7 2 4
6 6 8 5 9 2
1 6 6 1 0 7
5 9 3 8 8 4
0 0 0 0 0 0
输出样例:
Can't
Can
Can't
Can't
Can

方法一:二进制优化 dp

T...

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int n=6, m=120005;
int k=1, w[n+1], f[m];

int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    while (true) {
        ll x,s=0;
        for (int i=1; i<=n; i++) {
            cin>>x, s+=i*x;
            for (int j=1; j<=x; j<<=1) w[k++]=i*j, x-=j;
            if (x) w[k++]=i*x;
        }
        if (s==0) break;
        if (s&1) cout << "Can't\n";
        else {
            f[0]=1;
            for (int i=1; i<=k; i++)     
            for (int j=m; j>=w[i]; j--) {
                f[j]|=f[j-w[i]];
            }
            cout << (f[s/2] ? "Can\n" : "Can't\n");
        }
    }    
    return 0;
}

复杂度分析

  • Time\(O(nlog_2x)\)
  • Space\(O(...)\)

方法二:贪心+dp


复杂度分析

  • Time\(O()\)
  • Space\(O()\)
原文地址:https://www.cnblogs.com/wdt1/p/13602222.html