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;
    }

     

     

     

     

  • 相关阅读:
    深入入门正则表达式(java) 匹配原理 2 回溯
    java实现sftp实例
    自定义注解
    java构造器
    Does the parameter type of the setter match the return type of the getter?
    JAVA经典算法40题(18)
    关于session的详细解释
    .net上传功能fileupload代码
    ContentUris类使用介绍
    java回顾之类初级
  • 原文地址:https://www.cnblogs.com/y1040511302/p/9733340.html
Copyright © 2011-2022 走看看