p1054 簡單揹包問題的遞歸解法

揹包問題
描述 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";
}
發佈了41 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章