PKU 1564

来源:互联网 发布:广州数控g71编程实例 编辑:程序博客网 时间:2024/06/14 05:41
/*我自己写的递归方法,但是有些错误*/ #include<iostream>#include<string.h>#include<fstream>using namespace std;int a[100],sum,k=0,n,p,s[100],num,f=0;void dfs(int x){int i,j;if(x>n) return ; for(i=x;i<n;i++)//通过这个循环,使每个元素都能够遍历,依次查找出满足条件的几个元素,依次相加之后的结果存放在sum中 {if(sum<num){//if(a[i]==a[i+1]) i++;sum+=a[i];s[k++]=a[i];    }if(sum>num){sum-=a[i];//当前元素不满足条件,通过这个if()语句,回复之前的状态,即 sum-=a[i];s[--k]=0;        s[--k]=0;}if(sum==num)//满足条件是,将满足条件的元素存放在s数组中,输出之后,需要回复之前的状态,即对这个元素之后的下一个元素进行遍历,查找,得出正确的结果,想要的结果 {f=1;for(j=0;j<k;j++){if(j!=k-1&&s[j+1])cout<<s[j]<<"+";else cout<<s[j]<<endl;    }sum-=a[i];//状态恢复     s[--k]=0;continue;    } //dfs(i+1);   }memset(a,0,sizeof(a));memset(s,0,sizeof(s));sum=0;k=0;    dfs(x+1);//对第i个元素进行所有的遍历和查找 return ;}int main(){freopen ("data.txt","r",stdin);int i,j;while(cin>>num>>n&&num&&n){f=0;sum=0;for(i=0;i<n;i++)cin>>a[i];//for(i=0;i<n;i++)dfs(0);//从数组的第一个元素开始遍历 if(f==0) cout<<"No answer"<<endl; //cout<<s[i]<<endl;}return 0;}

/*网上的参考代码,和我的很相似*/

/*#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string>#include <string.h>#include <algorithm>#include <stack>#include <map>#include <queue>#include <vector>#include<fstream>using namespace std;int a[15];bool used[15];int n,sum,yes;void dfs(int index,int nowsum){    if(nowsum==sum){  //找到一种情况并不退出,而是继续找,知道递归完        yes=0;        bool flag=true;        for(int i=0;i<n;i++){            if(used[i]){                if(flag){                  printf("%d",a[i]);                  flag=false;                 }                else                  printf("+%d",a[i]);             }       }     printf("\n");    }    else{        for(int i=index;i<n;i++){            if(nowsum+a[i]>sum)                 continue;            if(used[i]==0){                used[i]=1;                dfs(i+1,nowsum+a[i]);                used[i]=0;    //恢复上次状态                int k=i+1;   // 比如有序列 5 5 5 1 sum=6;                 // 虽然找到了5+1=6 但是只需要输出一次即可 ,所以index 从相邻连续一样的数从头变化到脚,这样就解决了重复的情况,                //假如 sum=10 找到了5+5,下标依旧如上变化                while(k<n&&a[k]==a[i])                    k++;                i=k-1;            }        }    }}int main(){    freopen("data.txt","r",stdin); int i,j,k;    while(cin>>sum>>n&&(sum||n)){        yes=1;        for(i=0;i<n;i++)          scanf("%d",&a[i]);        for(i=0;i<n;i++)           if(a[i]<=sum)   //从a[i]<=sum开始搜索              break;     printf("Sums of %d:\n",sum);     dfs(i,0);     if(yes)      printf("NONE\n");    }    return 0;}*/

0 0
原创粉丝点击