• 装载问题加强版


    /*
    1328.装载问题加强版
    时限:1000ms 内存限制:10000K  总时限:3000ms
    描述
    现在码头有一批重量不同的货物,有三艘装载量不同的货船,试求出能否一次将货物装完




    输入
    第一行给出货物的数量n(n<=10)
    第二行有n个整数,分别表示这n个货物的重量
    第三行有3个整数,分别表示三艘货船的载重量




    输出
    若能够一次装完输出Yes,否则输出No




    输入样例
    4
    1 2 3 4
    2 3 5




    输出样例
    Yes
    BY yuan
    2014.6.19
    At nwpu.xf
    */
    #include<stdio.h>
    #include<iostream>
    using namespace std;
    int a[10];
    int b[10];
    bool mark[10];
    bool flag[10];
    int w1,w2,w3;
    int n,j;
    int num=0;
    int sum1=0,sum2=0;
    int csum1=0,csum2=0;
    void backtrack1(int k)
    {


        if(k>=n){
           if(sum1>csum1&&sum1<=w1){
               for(int i=0;i<n;i++)
                  flag[i]=mark[i];
              csum1=sum1;}
              return;}
        sum1+=a[k];
        mark[k]=1;
        backtrack1(k+1);
        sum1-=a[k];mark[k]=0;
        backtrack1(k+1);
    }


    void backtrack2(int k)
    {
        if(k>=j){
           if(sum2>csum2&&sum2<=w2)
              csum2=sum2;
              return;}
        sum2+=b[k];
        backtrack2(k+1);
        sum2-=b[k];
        backtrack2(k+1);
    }


    void sort()
    {int temp;
        if(w1>w2)
           {temp=w1;
           w1=w2;
           w2=temp;
           }
        if(w2>w3)
        {
            temp=w2;
            w2=w3;
            w3=temp;
        }
        if(w1>w2)
        {
            temp=w1;
            w1=w2;
            w2=temp;
        }
    }
    int main()
    {int k=0,i;
        scanf("%d",&n);
        for(i=0;i<n;i++)
           {cin>>a[i];
            mark[i]=0;
           flag[i]=0;
           num=num+a[i];}
        cin>>w1;cin>>w2;cin>>w3;
        sort();
        backtrack1(0);
        for(i=0;i<n;i++)
           if(flag[i]==0)
              b[j++]=a[i];
        backtrack2(0);
        if(num-csum1-csum2<=w3)
          cout<<"Yes"<<endl;
        else
          cout<<"No"<<endl;
          return 0;
    }










    
    



  • 相关阅读:
    Java 对象的内存布局(HotSpot 实现)
    HDFS 伪分布式环境搭建
    Java 多线程(四):锁(二)
    使用二叉树的递归套路来解决的问题
    乘积小于 K 的子数组
    Netty 学习(三):通信协议和编解码
    HDFS 分布式环境搭建
    Netty 学习(一):服务端启动 & 客户端启动
    累加和为 K 的最长子数组问题
    使用单调栈来解决的一些问题
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4254557.html
Copyright © 2020-2023  润新知