题目链接:http://poj.org/problem?id=1564
给出m个数,求出和为n的组合方式;并按从大到小的顺序输出;
简单的dfs但是看了代码才会;
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n, m, flag; int a[11000], b[11000]; int cmp(int a, int b) { return a>b; } void dfs(int pos, int len, int sum)///pos代表位置; { if(sum==n) { flag=1; printf("%d", b[0]); for(int i=1; i<len; i++) printf("+%d", b[i]); printf("\n"); return ; } for(int i=pos; i<m; i++) { if(sum+a[i]<=n) { b[len]=a[i]; dfs(i+1, len+1, sum+a[i]); while(i+1<m && a[i]==a[i+1])i++;///去重; } } } int main() { while(scanf("%d %d", &n, &m), m+n) { for(int i=0; i<m; i++) scanf("%d", &a[i]); sort(a, a+m, cmp); flag = 0; printf("Sums of %d:\n", n); dfs(0, 0, 0); if(flag==0) printf("NONE\n"); } return 0; }
时间: 2024-09-30 02:18:57