• 【多重背包】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()\)
  • 相关阅读:
    linux cut的用法
    删除表的语句(drop truncate delete)
    mysql中的模糊查询
    linux之软连接 硬链接 link ln
    使用robot合并Robot Framework测试报告
    Python中的字典
    python logger 动态设置日志名
    K8S(Kubernetes)学习笔记
    [转]CURL常用命令
    python网站目录扫描器2.0版
  • 原文地址:https://www.cnblogs.com/wdt1/p/13602222.html
Copyright © 2020-2023  润新知