您的位置:首页 > 其它

51nod 1268 和为K的组合 【dfs or dp】

2017-10-22 20:41 423 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: