UVa 562 - Dividing coins

来源:互联网 发布:上海太平洋保险java 编辑:程序博客网 时间:2024/04/29 11:55

题目:给定m个硬币分成两组,求两组和的最小差值。

分析:dp、背包。经典01背包模型,把硬币看成体积和价值相同的物品即可,利用背包求出总和一半的价值的容量能取得的最大价值,然后sum-2*f[sum/2]即为结果。

#include <stdio.h>#include <stdlib.h>#include <string.h>int coin[ 105 ];int f[ 50005 ];int main(){int n,m;while ( scanf("%d",&n) != EOF )for ( int t = 1 ; t <= n ; ++ t ) {scanf("%d",&m);int sum = 0;for ( int i = 1 ; i <= m ; ++ i ) {scanf("%d",&coin[i]);sum += coin[i];}memset( f, 0, sizeof(f) );for ( int i = 1 ; i <= m ; ++ i )for ( int j = sum/2 ; j >= coin[i] ; -- j )if ( f[j] < f[j-coin[i]]+coin[i] )f[j] = f[j-coin[i]]+coin[i];printf("%d\n",sum-2*f[sum/2]);}return 0;}


原创粉丝点击