NYOJ 邮票分你一半

邮票分你一半

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
 
描述
     小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明。每张邮票上都有分值,他们想把这些邮票分成两份,并且使这两份邮票的分值和相差最小(就是小珂得到的邮票分值和与小明的差值最小),现在每张邮票的分值已经知道了,他们已经分好了,你知道最后他们得到的邮票分值和相差多少吗?
 
输入
第一行只有一个整数m(m<=10000),表示测试数据组数。
接下来有一个整数n(n<=100000),表示邮票的张数。
然后有n个整数Vi,表示第i张邮票的分值。
输出
输出差值,每组输出占一行。
样例输入
2
5
2 6 5 8 9
3
2 1 5
样例输出
0
2

这道题和zb的生日是一样的,也可以用DFS

#include <iostream>
#include <cstring>
using namespace std;

int N;
int value[100005];
int dp[1000005];
int sum;

int main()
{
    int i,j;
    int n;
    cin>>N;
    while(N--)
    {
        cin>>n;
        sum=0;
        for(i=0;i<n;i++)
        {
            cin>>value[i];
            sum+=value[i];
        }
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++)
        {
            for(j=sum/2;j>=value[i];j--)
            {
                if(dp[j]<dp[j-value[i]]+value[i])
                {
                    dp[j]=dp[j-value[i]]+value[i];
                }
            }
        }
        cout<<sum-2*dp[sum/2]<<endl;
    }
    return 0;
}

 

 

posted on 2012-02-11 21:50  lzm风雨无阻  阅读(222)  评论(0编辑  收藏  举报

导航