nyoj 邮票分你一半

邮票分你一半

时间限制: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深搜:

#include <iostream>
using namespace std;

int a[1002],mid,m,Max;
//每个邮票都有两种选择,给小明或不给小明
void DFS(int i,int count)
{
if(Max==mid) //若Max的值恰好等于mid,则退出本次搜索,返回上层
return ;
if(i==m)//i==m时表示数组已经遍历完,因为在输入时数组的最大范围是m-1;
{
if(count>Max)//数组遍历完之后判断下这次获取的邮票的分值是否比上次更大(更接近mid),
Max=count;//若是,则更新Max的值
return ;
}
if(a[i]+count<=mid)//如果此时的邮票的总分值+a[i]的值小于一半,则选择这个邮票
DFS(i+1,count+a[i]);
DFS(i+1,count);//此时的分值大于邮票的一半,不选
}

int main()
{
int n;
cin>>n;
while(n--)
{
int sum=0;//计算邮票的总分值
Max=0;//计算一个人最多得的有票的分值
cin>>m;
for(int i=0;i<m;i++)
{
cin>>a[i];
sum+=a[i];
}
mid=sum/2;//因为每人最多得到的邮票恰好是总分值的一半,此次差值最小,所以 让每个人得到的不超过总分值的一半
DFS(0,0);

cout<<sum-2*Max<<endl;
}
return 0;
}

动态规划:

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

int a[1005],dp[1005];
int main()
{
int n;
cin>>n;
while(n--)
{
int m,sum=0;
cin>>m;
for(int i=0;i<m;i++)
{
cin>>a[i];
sum+=a[i];
}

memset(dp,0,sizeof(dp));
for(int i=0;i<m;i++)//控制每次访问哪个邮票
{
for(int j=sum/2;j>=a[i];j--)//每个人最多得一半邮票
dp[j]=min(dp[j-a[i]]+a[i],dp[j]);//选或不选,选的话就要减去当前所能接受的最大的邮票的分值
}
cout<<fabs(sum-2*dp[sum/2])<<endl;
}
return 0;
}

原文地址:https://www.cnblogs.com/tianzeng/p/8572765.html

时间: 2024-08-06 15:50:56

nyoj 邮票分你一半的相关文章

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 456 邮票分你一半(01背包)

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

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

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

邮票分你一半

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

我也许一无所有,却可以把唯一的馒头分你一半。

每个人都有很多朋友,或男或女.有些关系更亲近的称为:蓝颜直接.红颜知己,闺蜜等等,我也不例外. 要是谁说他没朋友,定时人品有问题,就算人品有问题的人也是有朋友的,花花世界,谁还没个朋友,怎么得?那你又怎么知道那个朋友你要交几分深,该是表面朋友,还是拿心去换,或是男同志们常挂嘴边的值得拿命去换的朋友?那就要看你的情况了. 酒肉朋友.吃喝玩乐,哥两好啊,喝杯酒啊,你一杯我一杯,然后坐一块冒根小烟,说的五花八门,吹得是海阔天空,什么拳打南山敬老院,脚踢北海幼儿园...猛吹,把牛皮 往破了吹,你能吹,我

分我一半的眼泪代码

<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?type=2&id=451703927&auto=1&height=66"></iframe> http://

创业泡沫的「军功章」,高薪低能的程序员要分走一半

今年 9 月阿里校招规模缩减,薪水也较往年有所下降.甚至还出现了不仅仅是产品.运营这样的非技术岗位受到了波及,就连核心开发岗位也未能幸免.甚至出现了给了 Offer 再拒绝学生的情况,让应届生们体验了一把「拥抱变化」. 程序员云集的社区,如 v2ex.知乎立刻出现了对阿里巴巴的声讨.程序员们纷纷表示阿里巴巴在这件事情上的表现真是烂到极点,然后又惯例把阿里巴巴的 HR 制度批判一番,最后以「阿里药丸」收尾. 在一片声讨的声音中,我联想到了一些别的事情.回想 2008 年阿里巴巴在香港上市,风头正劲

nyoj 94-cigarettes (分清楚,那一部分的cigarettes是用过的,那一部分是没有用过的)

94-cigarettes 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 提交数:20 难度:2 题目描述: Tom has many cigarettes. We hypothesized that he has n cigarettes and smokes them one by one keeping all the butts. Out of k > 1 butts he can roll a new cigarette. Now,do you know ho