本题我改了很久。。到最后也没明白为什么这么写是对的。。看来DFS+回溯的理解还不是很透彻。。
#include<stdio.h>
#include<stdlib.h>
struct Card
{
int val;
int num;
};
static int n, m, total;
static struct Card *array;
static int cmp(const void *p1, const void *p2)
{
struct Card *c1 = (struct Card *) p1;
struct Card *c2 = (struct Card *) p2;
return c2->val - c1->val;
}
static void dfs(int depth, int sum)
{
int i;
for (i = depth; i < m; i++)
{
if (array[i].num)
{
if (array[i].val + sum < n)
{
array[i].num--;
if(array[i].num)
dfs(i, array[i].val + sum);
else
dfs(i+1, array[i].val + sum);
array[i].num++;
}
else if (array[i].val + sum == n)
total++;
}
}
}
int main()
{
int count = 0;
while (scanf("%d %d", &n, &m) != EOF)
{
array = malloc(m * sizeof(struct Card));
total = 0;
int i;
for (i = 0; i < m; i++)
scanf("%d %d", &(array[i].val), &(array[i].num));
qsort(array, m, sizeof(struct Card), cmp);
dfs(0, 0);
printf(count++ ? "\n" : "");
printf("%d\n", total);
free(array);
}
return 0;
}