UVA 562 - Dividing coins

考虑全面,01背包问题:

代码如下:

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100 + 5
#define MAXN1 25000 + 100
int coin[MAXN], f[MAXN][MAXN1];
int n, m, sum, c;
/*int cmp(const void* _p, const void* _q)
{
int *p = (int *)_p;
int *q = (int *)_q;
return *p - *q;
}
*/
void dp()
{
int i, j, k;
memset(f, 0, sizeof(f));
/*for(i = 1; i <= m; i ++)
{
if(coin[i]>c) break;
for(j = coin[i]; j <= c; j ++)
{
if(f[i-1][j] < f[i-1][j-coin[i]]+coin[i])
f[i][j] = f[i-1][j-coin[i]]+coin[i];
else f[i][j] = f[i-1][j];
}
}
*/
for(i = 1; i <= m; i ++)
for(j = 0; j <= c; j ++)
{
f[i][j] = f[i - 1][j];
if(j >= coin[i] && (k = f[i - 1][j - coin[i]] + coin[i]) > f[i][j])
f[i][j] = k;
}
printf("%d\n",sum-2*f[m][c]);
}
void input()
{
while(scanf("%d",&n) == 1)
{
while(n --)
{
sum = 0;
scanf("%d",&m);
for(int i = 1; i <= m; i ++)
{
scanf("%d",&coin[i]);
sum += coin[i];
}
c = sum / 2;
//qsort(coin + 1, m, sizeof(coin[0]), cmp);
dp();
}
}
}
int main()
{
input();
return 0;
}



posted on 2012-03-15 22:58  BFP  阅读(286)  评论(0编辑  收藏  举报