算法——簡單揹包問題

以前是“來,幫我看看這道題

現在是“耶,網上有答案!

只要思考,都能變成你大腦的東西。那麼,你思考了麼?

目錄

題目——簡單揹包問題

題目描述

輸入

輸出

樣例輸入

樣例輸出

解題

完整代碼

 相關題目


 

題目——簡單揹包問題

題目描述

 

設有一個揹包可以放入的物品重量爲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;
}

 相關題目

上一篇:算法——Coin Changing(最少硬幣數)

 


如果看不明白某些算法,那是很正常的,少玩一會兒手機,專心理解幾十分鐘(對!幾十分鐘!當然是針對入門小白啦),就會搞明白的。並且,你還會說“原來辣麼簡單!”。——Lynn

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章