NYOJ 456 邮票分你一半(01背包)

邮票分你一半

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述
     小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明。每张邮票上都有分值,他们想把这些邮票分成两份,并且使这两份邮票的分值和相差最小(就是小 珂得到的邮票分值和与小明的差值最小),现在每张邮票的分值已经知道了,他们已经分好了,你知道最后他们得到的邮票分值和相差多少吗?
输入
第一行只有一个整数m(m<=1000),表示测试数据组数。
接下来有一个整数n(n<=1000),表示邮票的张数。
然后有n个整数Vi(Vi<=100),表示第i张邮票的分值。
输出
输出差值,每组输出占一行。
样例输入
2
5
2 6 5 8 9
3
2 1 5
样例输出
0
2
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<string.h>
 5 using namespace std;
 6 const int MAX = 50005;
 7 int dp[MAX],a[MAX];
 8 int main()
 9 {
10     int T,n,i,j,sum;
11     scanf("%d",&T);
12     while(T--)
13     {
14         sum=0;
15         memset(dp,0,sizeof(dp));
16         scanf("%d",&n);
17         for(i=0;i<n;i++)
18         {
19             scanf("%d",&a[i]);
20             sum+=a[i];
21         }
22         for(i=0;i<n;i++)
23         {
24             for(j=sum/2;j>=a[i];j--)
25             {
26                 if(dp[j]>dp[j-a[i]]+a[i])
27                     dp[j]=dp[j];
28                 else
29                     dp[j]=dp[j-a[i]]+a[i];
30             }
31         }
32         printf("%d\n",sum-2*dp[sum/2]);
33     }
34     return 0;
35 }

时间: 2024-08-27 06:17:30

NYOJ 456 邮票分你一半(01背包)的相关文章

nyoj 456——邮票分你一半——————【背包思想搜索】

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

NYOJ 456 邮票分你一半

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

nyoj 邮票分你一半

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

邮票分你一半(DP-背包)

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

邮票分你一半

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

UVA 562 Dividing coins 分硬币(01背包,简单变形)

题意:一袋硬币两人分,要么公平分,要么不公平,如果能公平分,输出0,否则输出分成两半的最小差距. 思路:将提供的整袋钱的总价取一半来进行01背包,如果能分出出来,就是最佳分法.否则背包容量为一半总价的包能装下的硬币总值就是其中一个人能分得的最多的钱了,总余下的钱减去这包硬币总值.(只需要稍微考虑一下总值是奇数/偶数的问题) 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #includ

NYOJ(325)+NYOJ(456),01背包

题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=325 http://acm.nyist.net/JudgeOnline/problem.php?pid=456 太久没有接触DP了,分类把这个题目分到了搜索,其实是01背包,有意思的是这里的价值也是重量,我最多装sum/2,那么每个邮票的价值也就变成了重量,并且要尽可能的装满,价值也是价值的含义 两道题几乎一样. #include <stdio.h> #include <mat

NYOJ 1091 超大01背包(折半枚举)

这道题乍一看是普通的01背包,最最基础的,但是仔细一看数据,发现普通的根本没法做,仔细观察数组发现n比较小,利用这个特点将它划分为前半部分和后半部分这样就好了,当时在网上找题解,找不到,后来在挑战程序设计上找到了这个题,就拿来引用一下 挑选物品的方法总从2^n中,直接枚举肯定不行,因为n最大为40,但是如果n为20就可以了,这时候就要用到折半枚举,先枚举前一半,在枚举后一半.先把前把部分的选取方法对应的重量和价值总和记为w1, v1,这样后半部分寻找w2 <= W - w1时 使v2最大的选取方

分辣条-01背包恰好装满情况

分辣条 发布时间: 2016年6月26日 20:36   最后更新: 2016年6月26日 20:37   时间限制: 1000ms   内存限制: 128M 描述 "你喝的酸奶是我买的,辣条也是我买的,你现在要跟我分手,你把我当什么?" "因为你每次分辣条的时候都比我多一根!" 可见分好辣条是一件多么重要的事情.. 现在有n(1<=n<=200)根辣条,每根辣条的重量为a1,a2...ai..an(1<=ai<=100). 那么能不能把这些