您的位置:首页 > 其它

uva562 - Dividing coins(简单动规)

2013-06-03 23:07 246 查看
找平衡的01背包问题。。。。

开始的时候不知道怎么直接动规出答案,

后来人家的思路,才发现这道题可以间接的动规出来答案。

就是把sum求出来,然后用动规枚举所有组合情况。然后找最小的sum-ii的差值,min{sum-i-i}

这道题有sum==i的情况。



1

1

5

答案应该是5

所以最后找的时候要从0--sum遍历。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#define M 50005
#define N 105
#define INF 0x7fffffff
int n, v
;
bool f[M];

int main ()
{
int cas, sum;
scanf("%d",&cas);
while(cas--)
{
sum = 0;
scanf("%d",&n);
for(int i = 0; i < n; i++) {scanf("%d",&v[i]); sum+=v[i];}
memset(f,0,sizeof(f));
f[0] = 1;
for(int i = 0; i < n; i++)
for(int j = sum; j >= v[i]; j--)  if(f[j-v[i]])
f[j] = 1;
int min = INF;
for(int i = 0; i <= sum; i++) if(f[i])
{
int tt = abs(sum-i-i);
min = min > tt ? tt : min;
}
printf("%d\n",min);
}
return 0;
}


 

最后的遍历可以优化。

for(int i = sum/2; i >= 0; i--)
if(f[i]) {min = i; break; }
printf("%d\n",sum-2*min);


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: