設有乙個揹包可以放入的物品重量為s,現有n件物品,重量分別是w1,w2,w3,…wn。問能否從這n件物品中選擇若干件放入揹包中,使得放入的重量之和正好為s。
如果有滿足條件的選擇,則此揹包有解,否則此揹包問題無解。
輸入資料有多行,包括放入的物品重量為s,物品的件數n,以及每件物品的重量(輸入資料均為正整數)
多組測試資料。
對於每個測試例項,若滿足條件則輸出「yes」,若不滿足則輸出「no「
20 5
1 3 5 7 9
這種型別的題屬於簡單np問題。對於揹包承重 s ,我們有 n 個物品,設每個物品重量儲存在陣列 arr[n] 中對應位置上。yes
現在我們考慮一般情況,對每個物品 i 我們只有兩種選擇:要<--or-->不要
要 i :那麼揹包剩下承重 s = s - arr[i],剩餘物品個數 n = n - 1;
不要 i :那麼揹包剩下承重不變 s = s,剩餘物品個數 n = n - 1;
現在我們考慮一下退出條件(特殊情況):
當 s = 0 時,我們已經得到解了,返回 true ;
當 n = 0 時,物品已經排除完了,所以沒有解,返回 false ;
當 arr[i] > s 時,這個物品重量多了(終止後面無效的遞迴),也沒解,返回 false ;
這樣就構建乙個遞迴函式解題。
// test.cpp: 定義控制台應用程式的入口點。
//#include#includeusing namespace std;
int arr[100];
bool npsolve(int s, int i, int n)
int main()
return 0;
}
小偷的揹包 swustoj
小偷的揹包 1000 ms 10000 kb 2422 6485 設有乙個揹包可以放入的物品重量為s,現有n件物品,重量分別是w1,w2,w3,wn。問能否從這n件物品中選擇若干件放入揹包中,使得放入的重量之和正好為s。如果有滿足條件的選擇,則此揹包有解,否則此揹包問題無解。輸入第一行為物品重量s ...
swust oj 0963 揹包問題
這種不考慮物品價值的揹包問題,無疑是為我這樣的渣提供了很好的理解空間。首先是思路 其實也就是對每個物品的 裝 與 不裝 的抉擇了。那麼就寫乙個函式,函式裡利用兩個遞迴,乙個表示裝,乙個表示不裝。那麼一層一層遞進之後,會發現每件物品的裝與不裝都有機會被考慮。途中只要有哪一步滿足了條件,便return ...
簡單01揹包 完全揹包
01揹包問題 有n個重量和價值分別為wi,vi的物品。從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。1 n 100 1 wi,vi 100 1 w 10000 第一行輸入n的值 接下來n行輸入wi,vi 最後一行輸入w for example input 2 31 2 3...