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

邮票分你一半

时间限制: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
来源
原创
import java.util.Scanner;
public class Main{//DP-背包
	public static void main(String[] args){
		Scanner input=new Scanner(System.in);
		int N=input.nextInt();
		while(N-->0){
			int n=input.nextInt();
			int a[]=new int[n];
			int sum=0;
			for(int i=0;i<n;i++){
				a[i]=input.nextInt();
				sum+=a[i];
			}
			int dp[]=new int[sum/2+10];
			for(int j=0;j<n;j++)
				for(int i=sum/2;i>=a[j];i--){
					dp[i]=Math.max(dp[i-a[j]]+a[j], dp[i]);
				}
			System.out.println(Math.abs(sum-dp[sum/2]*2));
		}
	}
}  

/*import java.util.Scanner;
public class Main{//超时
	private static int min=Integer.MAX_VALUE;
	public static void main(String[] args){
		Scanner input=new Scanner(System.in);
		int N=input.nextInt();
		while(N-->0){
			int n=input.nextInt();
			int a[]=new int[n];
			min=Integer.MAX_VALUE;
			for(int i=0;i<n;i++){
				a[i]=input.nextInt();
			}
			dfs(a,n-1,0,0);
			System.out.println(min);
		}
	}
	private static void dfs(int[] a, int n, int x, int y) {
		if(n<0){
			if(Math.abs(x-y)<min)
				min=Math.abs(x-y);
			return ;
		}
		dfs(a,n-1,x+a[n],y);
		dfs(a,n-1,x,y+a[n]);
	}
}  */

邮票分你一半(DP-背包),布布扣,bubuko.com

时间: 2024-10-25 06:02:44

邮票分你一半(DP-背包)的相关文章

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

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

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

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

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

邮票分你一半

邮票分你一半 时间限制: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

HDU 1011 Starship Troopers(树形dp+背包)

Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13109    Accepted Submission(s): 3562 Problem Description You, the leader of Starship Troopers, are sent to destroy a base of

二叉苹果树(树型DP+背包)

二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置.下面是一颗有4个树枝的树: 2   5 \  / 3  4 \  / 1 现在这颗树枝条太多了,需要剪枝.但是一些树枝上长有苹果. 给定需要保留的树枝数量,求出最多能留住多少苹果. 程序名:apple 输入格式: 第1行2个数,N和Q(1<=Q<= N,1<N<=

POJ3345---Bribing FIPA(树形dp+背包)

Description There is going to be a voting at FIPA (Fédération Internationale de Programmation Association) to determine the host of the next IPWC (International Programming World Cup). Benjamin Bennett, the delegation of Diamondland to FIPA, is tryin