1. 程式人生 > >【NOJ1328】【回溯_DFS】裝載問題加強版

【NOJ1328】【回溯_DFS】裝載問題加強版

1328.裝載問題加強版

時限:1000ms 記憶體限制:10000K  總時限:3000ms

描述

現在碼頭有一批重量不同的貨物,有三艘裝載量不同的貨船,試求出能否一次將貨物裝完

輸入

第一行給出貨物的數量n(n<=10)
第二行有n個整數,分別表示這n個貨物的重量
第三行有3個整數,分別表示三艘貨船的載重量

輸出

若能夠一次裝完輸出Yes,否則輸出No


#include <iostream>

using namespace std;

int n;
int w[11];
int c1,c2,c3;
int cur1,cur2;
int all;

bool dfs(int m);

int main()
{
    //輸入資料
    cin>>n;
    all=0;
    for(int i=0; i<n; i++)
    {
        cin>>w[i];
        all+=w[i];    //計算所有貨物的總重
    }
    cin>>c1>>c2>>c3;
    
    //深搜
    if(dfs(0))
    {
        cout<<"Yes"<<endl;
    }
    else
    {
        cout<<"No"<<endl;
    }
    return 0;
}

bool dfs(int m)
{
    if(m==n)    //所有貨物均已裝完
    {
        if(all-cur1-cur2<=c3)    //除去裝入1和2的貨物,如果剩下的貨物能夠裝入3
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        //第m件貨物裝入1
        cur1+=w[m];
        if(cur1<=c1)
        {
            if(dfs(m+1))
            {
                return true;
            }
        }
        cur1-=w[m];

        //第m件貨物裝入2
        cur2+=w[m];
        if(cur2<=c2)
        {
            if(dfs(m+1))
            {
                return true;
            }
        }
        cur2-=w[m];

        //第m件貨物不裝入1也不裝入2,等著最後裝入3
        if(dfs(m+1))
        {
            return true;
        }
        return false;
    }
}

【2018/11/20後記】

1、和裝載問題一模一樣。

2、上午還信誓旦旦的說,下週二之前不上CSDN了,真香!怕是要被考試之神懲罰了orz