UVa 562 Dividing coins(简单DP)

题意:

给你若干硬币,让你分成两份,使其绝对值之差尽量的小。

思路:

算出硬币的总和,然后把背包容量设置为硬币总和的一半,这个背包能拿到的最大价值即是2个人中某个人要拿到的价值。

01背包的思路就可以解决了。

#include <cstdio>

#include <cstdlib>

#include <cstring>



#define max(a,b) (((a) > (b)) ? (a) : (b))

const int MAXN = 50010;

int dp[MAXN];

int a[110];



int main()

{

    int cases;

    scanf("%d", &cases);

    while (cases--)

    {

        int m;

        int sum = 0;

        scanf("%d", &m);

        for (int i = 0; i < m; ++i)

        {

            scanf("%d", &a[i]);

            sum += a[i];

        }



        memset(dp, 0, sizeof(dp));



        int mid = sum >> 1;



        for (int i = 0; i < m; ++i)

            for (int v = mid; v >= a[i]; --v)

                dp[v] = max(dp[v], dp[v-a[i]] + a[i]);



        int ans;

        if (dp[mid] * 2 > sum)

            ans = dp[mid] * 2 - sum;

        else 

            ans = sum - dp[mid] * 2;



        printf("%d\n", ans);

    }



    return 0;

}

 

 

你可能感兴趣的:(div)