51nod 1268 和爲K的組合 【dfs or dp】


dfs做法
這個dfs寫的不錯 開始我寫的運行結果是錯的,這個是某一個大神的,代碼很短 ,而且很精煉,值得學習
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
int flag=0,n;
long long a[30];
long long m;
void dfs(int l,long long sum){
    if(sum==m){ flag=1; return ;}
    else if(sum>m) return ;

    for(int i=l+1;i<=n&&!flag;i++)  dfs(i,sum+a[i]);
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)   cin>>a[i];
    long long sum=0;
    dfs(0,0);
    if(flag)    cout<<"Yes"<<endl;
    else    cout<<"No"<<endl;
    return 0;
}


dp做法

#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
typedef long long ll;
ll num[100],dp[1000000];

int main(){
    ll k,n;
    cin>>n>>k;
    for(int i=0;i<n;i++) cin>>num[i];
    memset(dp,0,sizeof(dp));
    for(int i=0;i<n;i++) //枚舉每一個物品
        for(int j=k;j>=num[i];j--) //枚舉每一種大小的狀態
            dp[j]=max(dp[j],dp[j-num[i]]+num[i]);
    if(dp[k]==k) cout<<"Yes"<<endl;
    else cout<<"No"<<endl````````````

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