hdu 1258 Sum It Up

    技术2026-08-19  16

    深搜题,从第一个小于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;    }

    最新回复(0)