POJ1564 深搜 xingxing在努力
这道题乍一看是一道搜索题, 不过他的答案输出的确让人很烦, 幸好发现改变搜索的顺序可以很完美的求出来。。下面附上代码:
#include <cstring> #include <cstdio> #include <algorithm> using namespace std; int t, n; int a[1000 + 10]; int num[20]; //最多二十个数 int kind; int zishi[15]; int cnt ; void dfs(int dept, int tmp, int sum) //深度为dept, sum记录tmp元素的个数 { if(tmp == t) //找到了一个答案 { cnt++; for(int i=0; i<dept; i++) { for(int j=0; j<zishi[i]; j++) { sum--; printf("%d%c", num[i], sum==0?'\n':'+'); } } return ; } if(dept >= kind) return ; for(int i=a[num[dept]]; i>=0; i--) //使用了i个num[dept] { if(tmp+i*num[dept] > t) continue; zishi[dept] = i; dfs(dept+1, tmp+i*num[dept], sum+i); } } int main() { while(scanf("%d%d", &t, &n)==2) { if(n == 0) break; memset(a, 0, sizeof(a)); kind = 0; for(int i=0; i<n; i++) { int t; scanf("%d", &t); if(a[t] == 0) num[kind++] = t; a[t]++; } printf("Sums of %d:\n", t); cnt = 0; dfs(0, 0, 0); if(cnt == 0) printf("NONE\n"); } return 0; }

浙公网安备 33010602011771号