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;
}
51nod 1268 和爲K的組合 【dfs or dp】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.