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

来源:互联网 发布:截面数据是什么 编辑:程序博客网 时间:2024/06/06 03:16
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;}
原创粉丝点击