有兩艘船,載重量分別是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 28 77 9 2
8 80 0 0
yes求出不超過c1的最大值max,若總重量-max < c2則能裝入到兩艘船。no
#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.如果沒有指數相同的項 那麼此項的指數一定比當前所有項的指...