揹包問題
描述 Description
【問題描述】
簡單的揹包問題。設有一個揹包,可以放入的重量爲s。現有n件物品,重量分別爲w1,w2…,wn,(1≤i≤n)均爲正整數,從n件物品中挑選若干件,使得放入揹包的重量之和正好爲s,找到解輸出yes,無解輸出no。
【輸入格式】
第一行是物品總件數和揹包的載重量,第二行爲各物品的重量。
【輸出格式】
各所選物品重量。
【輸入樣例】
5 10
1 2 3 4 5
【輸出樣例】
yes
時間限制 Time Limitation
各個測試點1s
用weight[]表示各個物品的重量,heavy表示當前重量,h是當前物品數。
先把第h件物品放入揹包中,如果此時剛好滿了,就返回;否則繼續尋找第h-1件的情況。
邊界條件是 heavy=0->true heavy<0或 heavy>0且h<1(沒有物品)。
#include<iostream>
using namespace std;
int n;
bool pd(int heavy,int* weight,int h)
{
if(heavy==0) return true;
if(heavy<0||(heavy>0&&h<1)) return false;
if (pd(heavy-weight[h-1],weight,h-1))return true;
else return (pd(heavy,weight,h-1));
}
int main()
{
int m,w[1001]={0};
cin>>n>>m;
for (int i=1;i<=n;i++)
{
cin>>w[i];
}
if (pd(m,w,n+1)) cout<<"yes";else cout<<"no";
}