题意:给出sum和n个数,找出满足m(m<=n)个数相加等于sum。
思路:dfs.
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1258
View Code
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=110; 10 11 int a[N],b[N]; 12 int n,sum; 13 bool vis[N],flag; 14 15 void dfs(int s,int ssum,int cnt){ 16 if(ssum==sum){ 17 for(int i=1;i<=cnt;i++) printf(i==cnt?"%d\n":"%d+",b[i]); 18 flag=true; 19 return ; 20 } 21 int last=-1; 22 for(int i=s+1;i<=n;i++){ 23 if(!vis[i]&&last!=a[i]){ 24 last=a[i]; 25 vis[i]=true; 26 b[cnt+1]=a[i]; 27 dfs(i,ssum+a[i],cnt+1); 28 vis[i]=false; 29 } 30 } 31 } 32 33 int main(){ 34 35 // freopen("data.in","r",stdin); 36 // freopen("data.out","w",stdout); 37 38 while(scanf("%d%d",&sum,&n),sum||n){ 39 printf("Sums of %d:\n",sum); 40 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 41 memset(b,0,sizeof(b)); 42 memset(vis,false,sizeof(vis)); 43 flag=false; 44 dfs(0,0,0); 45 if(!flag) puts("NONE"); 46 } 47 return 0; 48 }