您的位置:首页 > 其它

【HDOJ】1258 Sum It Up

2014-03-23 11:49 405 查看
典型的深搜,剪枝的时候需要跳过曾经搜索过的相同的数目,既满足nums[i]=nums[i-1]&&visit[i-1]==0,visit[i-1]==0可以说明该点已经测试过。

#include <stdio.h>
#include <string.h>

#define MAXNUM 1005

int nums[MAXNUM];
int visit[MAXNUM];
int t, n;

void output() {
int i, j=0;

for (i=0; i<t; ++i) {
if (j && visit[i])
printf("+%d", nums[i]);
if (j==0 && visit[i]) {
printf("%d", nums[i]);
j = 1;
}
}
printf("\n");
}

int check(int index, int sum) {
if (index<0 || index>=t || visit[index] || sum+nums[index]>n)
return 0;
return 1;
}

int dfs(int beg, int sum) {
int i, val=0;

if (sum == n) {
output();
return 1;
}

for (i=beg; i<t; ++i) {
if (i>beg && nums[i]==nums[i-1] && visit[i-1]==0)
continue;
if (check(i, sum)) {
visit[i] = 1;
if (dfs(i+1, sum+nums[i]))
val = 1;
visit[i] = 0;
}
}

return val;
}

int main() {
int i;

while (scanf("%d%d", &n, &t)!=EOF && (n||t)) {
for (i=0; i<t; ++i)
scanf("%d", &nums[i]);
memset(visit, 0, sizeof(visit));
printf("Sums of %d:\n", n);
if ( !dfs(0, 0) )
printf("NONE\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: