以前是“來,幫我看看這道題!”
現在是“耶,網上有答案!”
只要思考,都能變成你大腦的東西。那麼,你思考了麼?
目錄
題目——簡單揹包問題
題目描述
設有一個揹包可以放入的物品重量爲S,現有n件物品,重量分別是w1,w2,w3,…wn。
問能否從這n件物品中選擇若干件放入揹包中,使得放入的重量之和正好爲S。
如果有滿足條件的選擇,則此揹包有解,否則此揹包問題無解。
輸入
輸入數據有多行,包括放入的物品重量爲s,物品的件數n,以及每件物品的重量(輸入數據均爲正整數)
多組測試數據。
輸出
對於每個測試實例,若滿足條件則輸出“YES”,若不滿足則輸出“NO”
樣例輸入
20 5
1 3 5 7 9
樣例輸出
YES
解題
使用動態規劃的思想,用 weight[1...n] 表示各個物件的重量,多個物件被選擇後,最後加上物件 weight[m] 剛好滿足總重量爲 s ,那麼必須滿足 s - weight[m] 與前面選擇的物件重量之和相等,重複這樣操作的時候,s變成了 s - weight[m],物件數量在原有的基礎上減少1個,某個被選擇的物件是重量weight[n]。從而我們可以利用遞歸判斷是否滿足條件:
if(packet(s - weight[n - 1], n - 1)){
return true;
}
else return packet(s,n - 1);
當然會遇到weight[m]相鄰的前面一個物件不是被選擇的行列,那麼跳過此物件再作判斷。
完整代碼
#include<iostream>
using namespace std;
int weight[1000];
bool packet(int s,int n){
if(s == 0) return true;
if(s < 0 ||(s > 0 && n < 1)){
return false;
}
if(packet(s - weight[n - 1], n - 1)){
return true;
}
else return packet(s,n - 1);
}
int main(){
int s, n;
while(cin>>s>>n){
for(int i = 0; i < n; i++){
cin>>weight[i];
}
if(packet(s,n))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
相關題目
如果看不明白某些算法,那是很正常的,少玩一會兒手機,專心理解幾十分鐘(對!幾十分鐘!當然是針對入門小白啦),就會搞明白的。並且,你還會說“原來辣麼簡單!”。——Lynn