1564:Sum It Up
keyword
BruteForce C++
概要
正の数Tとn(<12)個の数字が与えられる。和がTになる組合せを全て列挙する問題。
サイズが小さいのでBruteForce。重複を取り除くためにset< vector
int main(){ int mask, i, ns[15], n, m, t, sum; vector<int> tmp; set< vector<int> > ss; while(scanf("%d%d",&n,&t)){ if(n==0 && t==0) break; ss.clear(); printf("Sums of %d:\n", n); REP(i,t)scanf("%d",ns+i); sort(ns, ns+t, greater<int>()); REP(mask,(1<<t)){ sum = 0; REP(i,t)if(mask & (1<<i)) sum += ns[i]; if(sum == n){ tmp.clear(); REP(i,t)if(mask & (1<<i)){ tmp.PB(ns[i]); } ss.insert(tmp); } } if(ss.empty()) printf("NONE\n"); else{ for(__typeof(ss.rbegin()) it = ss.rbegin(); it!=ss.rend(); it++){ REP(i,SZ(*it)-1) printf("%d+",(*it)[i]); printf("%d\n",it->back()); } } } return 0; }