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
- PKU 1564
- pku 1018 && pku 1095
- pku 3345 && pku 3107
- PKU 1161、PKU 2524、 PKU 1308
- pku 1003
- pku 1125
- PKU 1002
- PKU题解
- pku 3278
- pku-1001
- pku-acm
- pku 1979
- PKU 1012
- pku 2236
- pku 2352
- pku 2395
- pku 2421
- pku 1001
- ADO.NET(用窗体实现crud)
- 基础学习-流水账
- .Net之路(十二)Cookie对象
- 【NOI2011】道路修建
- python IDLE 改变窗口背景颜色
- PKU 1564
- 2-3-4树
- CF2A. Winner
- Trie树(前缀树,字典树)
- hdu Broken Keyboard(模拟)
- C#多播委托(Multicast Delegate)
- 使用批处理文件设置环境变量
- Struts2内置拦截器
- 链接不同版本的CRT运行库导致堆错误