【NOJ1005】【算法实验二】【回溯算法】装载问题


1005.装载问题

时限:1000ms 内存限制:10000K  总时限:3000ms

描述

有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。

确定是否有可能将所有集装箱全部装入两艘船。

输入

多个测例,每个测例的输入占两行。

第一行一次是c1、c2和n(n<=10);

第二行n个整数表示wi (i=1…n)。

n等于0标志输入结束。

输出

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


#include <iostream>

using namespace std;

//思路:将c1尽量填满,剩下的若能都装进c2,则成功
//因此只需找到一个可行解,不需深搜所有解,故dfs函数有bool返回值

int c1,c2;  //两个载重量
int n;      //集装箱个数
int w[11];  //集装箱重量
int wn1;    //当前装入c1的重量
int wn;     //总重量

bool dfs(int m);
bool owC1(int m);   //判断当前c1是否超重
bool owC2();        //判断最终解中c2是否超重

int main()
{
    cin>>c1>>c2>>n;
    while(n!=0){
        //初始化
        wn1=wn=0;
        //输入
        for(int i=0;i<n;i++){
            cin>>w[i];
            wn+=w[i];
        }

        if(dfs(0))
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;

        cin>>c1>>c2>>n;
    }
    return 0;
}
bool dfs(int m)
{
    if(m==n){           //C1装载完毕
        if(!owC2())         //若C2未超重
            return true;    //则找到一个可行解
    }
    else{
        if(!owC1(m)){
            wn1+=w[m];
            if(dfs(m+1))return true;    //若找到可行解便返回
            wn1-=w[m];
        }
        if(dfs(m+1))return true;

        return false;
    }
    return false;   //此句无用,仅为消warning
}

bool owC1(int m)    //判断c1是否超重
{
    if(wn1+w[m]>c1)
        return true;
    else
        return false;
}

bool owC2()         //判断c2是否超重
{
    int wn2=wn-wn1; //总重量-c1中重量=剩余重量
    if(wn2>c2)
        return true;
    else
        return false;
}

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/82911933
今日推荐