NOJ 1005 裝載問題 回溯法

2021-08-29 01:25:30 字數 899 閱讀 1821

有兩艘船,載重量分別是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 77 9 2

8 80 0 0

yes

no

求出不超過c1的最大值max,若總重量-max < c2則能裝入到兩艘船。

#include

using namespace std;

int c1,c2,n,w[

100]

=,a[

100]

=,sum=

0,sum1=

0,flag=0;

void

search

(int m)

sum=0;

//記得初始化(*)

}else}}

int main (

)search(0

);if(flag)

printf

("yes\n");

else

printf

("no\n");

}}

採用回溯法解決。類似於0-1揹包問題,但是需要多增加判斷條件。每乙個貨物不可拆分,意味著可能有所剩餘裝不下,所有的貨物重量為sum1,陣列中標記為1的為裝在1船,標記為0的裝在2船,這樣每一組排列都可以表示為一組01序列,然後判斷兩船能否裝下這些貨物。

但是回溯法方法有點冗餘,用動態規劃會更好一些。

noj 1005 裝載問題

兩個船和n個貨物,兩個船分別容量有一定的限制,貨物也有對應的重量。解決的策略是最優的裝乙個船,然後看剩下的重量是否超過了另外乙個船,如果超過了的話就不可解。include include include include include include using namespace std int ...

演算法練習 NOJ 1005 裝載問題

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述有兩艘船,載重量分別是c1 c2,n個貨櫃,重量是wi i 1 n 且所有貨櫃的總重量不超過c1 c2。確定是否有可能將所有貨櫃全部裝入兩艘船。輸入多個測例,每個測例的輸入佔兩行。第一行一次是c1 c2和n n 10 第二行n個...

noj 1005 多項式加法

對於輸入,由於是按指數遞減輸入的,故我們只需按照輸入順序進行儲存即可。對待乙個輸入 1.如果當前多項式為空,那麼將此項放入第一項 2.如果當前多項式不為空 3.如果有指數相同的項,那麼將此項與指數相同的項合併,如果係數變為0,則將此項刪除。4.如果沒有指數相同的項 那麼此項的指數一定比當前所有項的指...