题目描述:
每组数据给定一个大的数,和一系列降序的数值,要求列出不重复的数值中挑选的数的和为大数的方案,每一种方案里,每个数值最多只能使用一次。
思路:
dfs基础题,每次记录大数和当前总和的差值,当前位置,以及当前使用的数的数量,将每一个使用的数放进ans数组中。由于是dfs,每一种情况使用的数字放入ans中可以将上一种情况覆盖,所以不需要考虑初始化。
要注意的是,方案不能重复,所以每一层dfs中,下一个数值的选择必须是不重复的。
#include<cstdio> #include<iostream> using namespace std; int t,n,x[15],flag,ans[15]; void dfs(int un_sum,int where,int num) { if(!un_sum) { cout << ans[1]; for(int i = 2;i < num;i++) cout << '+' << ans[i]; cout << endl; flag = 0; return; } else if(where > n) { return; } ans[num] = x[where]; dfs(un_sum-x[where],where+1,num+1); for(int i = where+1;i <= n;i++) { if(x[i] != x[i-1] && un_sum >= x[i]) { ans[num] = x[i]; dfs(un_sum-x[i],i+1,num+1); } } } int main() { while(cin >> t >> n && t && n) { flag = 1; for(int i =1;i <= n;i++) cin >> x[i]; cout << "Sums of " << t << ':' << endl; for(int i = 1;i <= n;i++) { if(t >= x[i]) { dfs(t,i,1); break; } } if(flag) cout << "NONE" << endl; } return 0; }