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;
}

 

-------------------------------------------------------

kedebug

Department of Computer Science and Engineering,

Shanghai Jiao Tong University

E-mail: kedebug0@gmail.com

GitHub: http://github.com/kedebug

-------------------------------------------------------

原文地址:https://www.cnblogs.com/kedebug/p/2768257.html