hdu1258

来源:互联网 发布:液体浓度的算法 编辑:程序博客网 时间:2024/06/06 02:19
/*
分析:
    如果用记录所有情况,最后输出的方法的话,
那么要注意输出没组的时候,要和前面的所有组
进行是否相同的判断。


                                      2012-07-20
*/










#include"stdio.h"#include"string.h"#include"stdlib.h"int num[15];int n,aim;int ans[15],a_len;struct B{int ans[15];int len;}yes[1011];int key;int cmp(const void *a,const void *b){return *(int *)b-*(int *)a;}void P(){int i;if(a_len<=0)return ;for(i=0;i<a_len;i++)yes[key].ans[i]=ans[i];yes[key].len=a_len;key++;}void DFS(int k,int sum){int i;if(sum==aim){P();return ;}if(sum>aim)return ;for(i=k+1;i<n;i++){if(sum+num[i]<=aim){ans[a_len++]=num[i];DFS(i,sum+num[i]);a_len--;}}}int main(){int i,j,l;int flag;while(scanf("%d%d",&aim,&n),n){for(i=0;i<n;i++)scanf("%d",&num[i]);qsort(num,n,sizeof(num[0]),cmp);printf("Sums of %d:\n",aim);a_len=0;key=0;DFS(-1,0);if(!key)printf("NONE\n");else{printf("%d",yes[0].ans[0]);for(l=1;l<yes[0].len;l++)printf("+%d",yes[0].ans[l]);printf("\n");for(i=1;i<key;i++){flag=0;for(j=0;!flag&&j<i;j++){if(yes[i].len!=yes[j].len)continue;else{flag=1;for(l=0;l<yes[i].len;l++)if(yes[i].ans[l]!=yes[j].ans[l]){flag=0;break;}}}if(flag)continue;printf("%d",yes[i].ans[0]);for(l=1;l<yes[i].len;l++)printf("+%d",yes[i].ans[l]);printf("\n");}}}return 0;}