zoukankan      html  css  js  c++  java
  • noj算法 装载问题 回溯法

    描述:

    有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。

    输入:

    多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi (i=1…n)。n等于0标志输入结束。

    输出:

    对于每个测例在单独的一行内输出Yes或No。

    输入样例:

    7 8 2
    8 7
    7 9 2
    8 8
    0 0 0

    输出样例:

    Yes
    No

     

    题解:

           变形的01背包问题,先按最优解把c1装好,在看剩下的集装箱是否小于c2的容量。

     

    代码:

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    
    using namespace std;
    int c1,c2,n,s,w[11],b,f1[11],f2[11],cw;   //cw是当前最优解,b是记录的最优解,
    
    void fun(int i)
    {
        if(i>n)
        {
            if(cw>b)
            {
                for(int j=1;j<=n;j++)
                    f2[j]=f1[j];
                b=cw;
            }
            return;
        }
        s-=w[i];
        if(cw+w[i]<=c1){
            f1[i]=1;
            cw+=w[i];
            fun(i+1);
            cw-=w[i];
        }
        if(cw+s>b)
        {
            f1[i]=0;
            fun(i+1);
        }
        s+=w[i];
    }
    
    int main()
    {
        int i;
        while(1){
            cin>>c1>>c2>>n;
            b=0;
            s=0;
            cw=0;
            if(c1==0&&c2==0&&n==0) break;
            for(i=1;i<=n;i++) {cin>>w[i];s+=w[i];}
            fun(1);
            if(s-b<=c2)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
        return 0;
    }

     

     

     

     

  • 相关阅读:
    PostProcessor
    Headler
    HttpSession
    文件锁FileLock
    MappedByteBuffer
    RandomAccessFile
    setInterval和setTimeout的缺陷和优势分析
    CSS背景图片自适应 根据浏览器分辨率大小自动伸缩
    JS中的call()方法和apply()方法用法总结,以及方法体中this的定义
    Window及document对象
  • 原文地址:https://www.cnblogs.com/y1040511302/p/9733340.html
Copyright © 2011-2022 走看看