UVa 574 - Sum It Up

Contents

  1. 1. Problem
  2. 2. Solution
  3. 3. Code

Problem

中文網址

Solution

本來用 DP 但不曉得怎印出各個組合,只好改用遞迴做了。
為了避免相同的組合,只要重複的數字在上一個沒選時,接下來一樣的也都不選。

Code

UVa 574
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<cstdio>

int t, n, num[12];
bool used[12], ok;
void backtracking(int idx, int sum);
int main()
{
while (scanf("%d%d", &t, &n) && n)
{
int i;
for (i = 0; i < n; i++)
{
scanf("%d", &num[i]);
used[i] = false;
}

ok = false;
printf("Sums of %d:\n", t);
backtracking(0, 0);
if (!ok)
puts("NONE");
}

return 0;
}
void backtracking(int idx, int sum)
{
if (sum == t)
{
if (!ok)
ok = true;

int i;
for (i = 0; i < idx; i++)
if (used[i])
{
printf("%d", num[i]);
break;
}

for (i++; i < idx; i++)
if (used[i])
printf("+%d", num[i]);
putchar('\n');

return;
}
else if (idx == n)
return;

int last = 0;
for (; idx < n; idx++)
{
if (last == num[idx])//避免重複的組合,只要沒有選上個一樣的,接下來也都不選同個數字
continue;

if (sum + num[idx] <= t)
{
used[idx] = true;
backtracking(idx + 1, sum + num[idx]);
}

used[idx] = false;
last = num[idx];
}
}