1. 程式人生 > >簡單背包問題(0032)-swust oj

簡單背包問題(0032)-swust oj

i++ -m put rip while () blog 簡單 pull

簡單背包問題(0032)

Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 5657 Accepted: 1714 Accepted 搜索 動態規劃

設有一個背包可以放入的物品重量為S,現有n件物品,重量分別是w1,w2,w3,…wn。

問能否從這n件物品中選擇若幹件放入背包中,使得放入的重量之和正好為S。

如果有滿足條件的選擇,則此背包有解,否則此背包問題無解。

Description

輸入數據有多行,包括放入的物品重量為s,物品的件數n,以及每件物品的重量(輸入數據均為正整數)

多組測試數據。

Input

對於每個測試實例,若滿足條件則輸出“YES”,若不滿足則輸出“NO“

Output 20 5 1 3 5 7 9 Sample Input YES
代碼: 遞歸,遍歷,搜索:
#include<iostream>
using namespace std;

int w[100],vis[100],k,s,n;
void dfs(int sum)
{
    if(sum==s)
    {
        k=1;
    }
    else
{ for(int i=0;i<n;i++) if(vis[i]==0) { vis[i]=1; dfs(sum+w[i]); vis[i]=0; } } } int main() { int i; while(cin>>s>>n) { for(i=0;i<n;i++) cin
>>w[i]; k=0; dfs(0); if(k==1) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } return 0; }

簡單背包問題(0032)-swust oj