深搜题,从第一个小于n的数字开始向下深搜,如果sum>n则跳过尝试下一个数,如果sum==n则打印,写了代码之后一直wa,百度解题报告后有个地方没看太懂,暂时先贴参考后的AC代码出来:
#include<iostream>#include <queue>using namespace std;int a[13], add[13], n, k, visited[13];int len;int check;void dfs(int deep, int sum){ if (sum == n){ check = 1; for (int i = 0; i < len; i ++){ if (i)printf("+"); printf("%d",add[i]); } printf("/n"); return ; } for (int i = deep; i < k; i ++){ if (sum + a[i] > n)continue; if (i && a[i]==a[i-1]&&!visited[i-1])continue;//此句正在思考中,大意是当一个数的前一个数与其相等并且没有被访问过则跳
//过此数 if (!visited[i]){ add[len++] = a[i]; visited[i]=1; dfs(i+1, sum+a[i]); visited[i] = 0; len --; } }}int main(){ while (EOF!= scanf("%d %d",&n, &k)&&(n|k)){ for (int i = 0; i < k; i ++){ scanf("%d", &a[i]); } int i; for (i = 0; i < k; i ++){ if (n >= a[i])break; } memset(visited, 0, sizeof(visited)); check = 0; len = 0; printf("Sums of %d:/n", n); dfs(i,0); if (!check)printf("NONE/n"); } return 0; }
