【nyoj-456】 邮票分你一半 (dp,0-1背包的中点问题)

题干:

邮票分你一半

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

解题报告:

      这题看起来很简单但是其实还是有坑的!下面提供n多中ac的代码。坑就在于 ,sum有可能是奇数!!

AC代码:(网络版,至今不知为什么这么做可以,普通0-1背包)

#include<bits/stdc++.h>using namespace std;
int n;
int v[1000 + 5];
int dp[100000 + 5];
int main()
{int t;int sum = 0;cin>>t;while(t--) {sum = 0;cin>>n;for(int i = 1; i<= n; i++) {scanf("%d",&v[i]);sum += v[i];}int yuan=sum;sum=(sum+1)/2;//这里直接sum=sum/2  也可以ac!!!即 +1与否不影响if(n == 1) {cout << v[1] << endl; continue;}memset(dp,0,sizeof(dp));for(int i = 1; i<=n; i++) for(int j = sum; j>=v[i]; j--) {if(abs(j-dp[j]) < abs(dp[j-v[i]]+v[i]-j)) dp[j]=dp[j];else dp[j]=dp[j-v[i]]+v[i];}cout << abs(yuan-dp[sum]-dp[sum]) << endl;}return 0 ;} 

对于上面这种方法,我只理解到了下面的内容:

      因为背包是一类问题,比如一般的0-1背包,你取dp[j] = max(),是因为你想得到价值最大的,所以你这个状态代表的是,前i个物品在j容量下的最大价值是dp[j]这么大。 

      所以对于这个题来说你想得到的是最接近一半的分值,所以你dp[j]中存的应该是最接近当前价值的, 即: 如果更接近当前价值,那我就更新他。

AC代码2:(也是普通0-1背包)

#include<bits/stdc++.h>using namespace std;
int n;
int v[1000 + 5];
int dp[100000 + 5];
int main()
{int t;int sum = 0;cin>>t;while(t--) {sum = 0;cin>>n;for(int i = 1; i<=n; i++) {scanf("%d",&v[i]);sum += v[i];}int half = sum>>1 ;//这里用half = sum>>1 + 1就错了!!但是half = (sum+1)>>1是对的。。。当然你最后输出的时候需要加个abs()才能ac!!!memset(dp,0,sizeof(dp));for(int i = 1; i<=n; i++) {for(int j = half; j>=v[i]; j--) {dp[j] = max(dp[j],dp[j-v[i]] + v[i]);}}cout << sum-2*dp[half]<<endl;}	return 0 ;} 

最开始就是这么写的但是我的输出相当于是cout << 2*(half - dp[half] )<<endl;样例也过了,我也觉着我这样理解是没有问题的,举个例子:总分值为10,我3他7,那我俩的差值不就是  2*((10/2)-3)这么大吗?如果  我4他6,,也可以成立,然后就这么交上去了,然后wa。看了别人的代码才发现,原来是奇偶数出现了问题,因为我试的样例是偶数(10嘛),所以肯定看样例肯定看不出来问题,于是我就改成了保留原sum,新开一个half,然后最后输出的时候用sum去减,而不是2*half去减。也就是把最后的输出改成了AC代码中那样的形式。

 

AC代码3:(装满型0-1背包)

 #include<bits/stdc++.h>using namespace std;
int n;
int v[1000 + 5];
int dp[100000 + 5];
int main()
{int t;int sum = 0;cin>>t;while(t--) {sum = 0;cin>>n;for(int i = 1; i<=n; i++) {scanf("%d",&v[i]);sum += v[i];}
//		sum=(sum+1)/2;if(n == 1) {cout << v[1] << endl; continue;}memset(dp,-0x3f3f3f3f,sizeof(dp));dp[0] = 0;for(int i = 1; i<=n; i++) {for(int j = sum; j>=v[i]; j--) {dp[j] = max(dp[j],dp[j-v[i]] + v[i]);}}int minn = 0x3f3f3f3f;for(int i = sum; i>=0; i--) {if(dp[i] >=0) {//cout << 2*(sum-dp[i])<<endl;break;minn = min(  abs(sum-dp[i]-dp[i]),minn);}}cout << minn<<endl;}return 0 ;} 

这段代码,是我在写完AC代码2,然后WA了之后,重新改了一下,不再有sum/=2这样的操作,而是直接扫到sum,然后从后往前一个个的扫,维护一个minn,最后输出minn,这样也AC了但是时间是500ms左右,是AC代码1,AC代码2 的两倍左右

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular中父子组件传值@Input @Output @ViewChild最全面最简单的总结

父组件传递给子组件&#xff1a; 值传递方式&#xff1a;Input既可以传递数据也可以传递方法 传递数据&#xff08;不举例了&#xff09;传递方法 // 父组件定义方法 parentRun(){alert(这是父组件的 run 方法); } 调用子组件时传入当前方法&#xff08;是传递方法不是调用方…

《TCP/IP详解》学习笔记(七):广播和多播、IGMP协议

单播&#xff0c;多播&#xff0c;广播的介绍 1单播(unicast) 单播是说&#xff0c;对特定的主机进行数据传送。例如给某一个主机发送 IP 数据包。这时候&#xff0c;数据链路层给出的数据头里面是非常具体的目的地址&#xff0c;对于以太网来说&#xff0c;就是网卡的 MAC 地…

【 POJ - 3628 】Bookshelf 2(dfs 或 dp,0-1背包)

题干&#xff1a; Farmer John recently bought another bookshelf for the cow library, but the shelf is getting filled up quite quickly, and now the only available space is at the top. FJ has N cows (1 ≤ N ≤ 20) each with some height of Hi (1 ≤ Hi ≤ 1,0…

ES5总结1:数组Array新特性最全最精简的详解

2个位置方法&#xff1a;indexOf lastIndexOf 5个迭代方法&#xff1a;forEach every some filter map 2个高阶函数&#xff1a;reduce reduceRight &#xff08;可用于数组求和&#xff09; API: 1、indexOf(searchElement: T, fromIndex?: n…

Apollo自动驾驶入门课程第③讲 — 定位

目录 1. 定位的概述 2. 定位方法介绍 2.1 GNSS RTK 2.2 惯性导航 2.3 激光雷达定位 2.4 视觉定位 2.5 Apollo定位 本文转自微信公众号&#xff1a;Apollo开发者社区 原创&#xff1a; 阿波君 Apollo开发者社区 8月17日 上周我们发布了 Apollo入门课堂第②讲—高精地图&…

【HRBUST - 1621】迷宫问题II (bfs)

题干&#xff1a; 小z身处在一个迷宫中&#xff0c;小z每分钟可以走到上下左右四个方向的相邻格之一。迷宫中有一些墙和障碍物。 同时迷宫中也有一些怪兽&#xff0c;当小z碰到任意一个怪兽时&#xff0c;小z需要将怪兽消灭掉才可以离开此方格。但消灭 怪兽会花费一定的时间。…

Linux与Bash 编程——Linux文件处理命令-L1

目录&#xff1a; linux系统与shell环境准备 Linux系统简介操作系统简史Linux的发行版&#xff1a;Linux与Windows比较&#xff1a;Linux安装安装包下载Linux的访问方式远程登录方式远程登录软件&#xff1a;mobaxterm的使用&#xff1a;使用电脑命令行连接&#xff1a;sshd的…

4.Transfer Learning

Intro 这是深度学习第4课。 在本课程结束时&#xff0c;您将能够使用迁移学习为您的自定义目标构建高度准确的计算机视觉模型&#xff0c;即使您的数据相对较少。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(mPFq5KMxKVw, width800, height450) S…

Angular相关的有价值的问题集锦

001. Angular的三大核心概念是什么&#xff1f; 答&#xff1a;组件化、模块化和路由&#xff08;Component、NgModule、Router&#xff09;,其中最核心的概念是组件化Component。 002. 前端为什么需要Router&#xff1f; 答&#xff1a;如果没有Router&#xff0c;浏览器的…

如何在Word中排版出漂亮规整的编程语言代码样式?【☆】

[1] 能输出各种编程语言并保持代码格式和语法高亮显示的网站&#xff1a; PlanetB | Syntax Highlight Code in Word Documents http://www.planetb.ca/syntax-highlight-word Welcome! — Pygments http://pygments.org/ [2] How do you display code snippets in MS Wor…

网络编程懒人入门(一):快速理解网络通信协议(上篇)

转自即时通讯网&#xff1a;http://www.52im.net/ 原作者&#xff1a;阮一峰(ruanyifeng.com&#xff09;&#xff0c;本文由即时通讯网重新整理发布&#xff0c;感谢原作者的无私分享。 1、写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统&#xff0c;很…

PCA算法中样本方差和协方差的无偏估计与n-1的由来

原文出处&#xff1a; http://blog.sina.com.cn/s/blog_c96053d60101n24f.html 在PCA算法中的方差协方差计算公式中除数为什么是n-1? 假设X为独立同分布的一组随机变量&#xff0c;总体为M&#xff0c;随机抽取N个随机变量构成一个样本&#xff0c;和是总体的均值和方差, 是常…

【Gym - 101915D】Largest Group(二分图最大团,状压dp)

题干&#xff1a; 大黑山上有小小民和小小涛两种物种&#xff0c;山东人小李想要研究这两种物种的关系 奇怪的是大黑山上有相同数量的小小民和小小涛。小李数了数一共有 P 个&#xff0c;小李分别给P个小小民和小小涛编号 1 - P 号&#xff0c;已知每对小小民之间都是好朋友&…

Apollo自动驾驶入门课程第④讲 — 感知(上)

目录 1. 感知的概述 2. 计算机视觉 3. 摄像头图像 4. LiDAR图像 5. 机器学习 6. 神经网络 7. 反向滤波法 本文转自微信公众号&#xff1a;Apollo开发者社区 原创&#xff1a; 阿波君 Apollo开发者社区 8月23日 上一篇文章中&#xff0c;我们发布了无人驾驶技术的 定位篇…

三种经典的洗牌算法

参考原文链接&#xff1a;https://blog.csdn.net/qq_25026989/article/details/89512769 问题描述&#xff1a;洗牌算法是将原来的数组进行打散&#xff0c;使原数组的某个数在打散后的数组中的每个位置上等概率的出现。 主要有3中经典的洗牌算法&#xff1a; 1.抽牌&#x…

【数据库实验课堂】实验一:数据库的管理

实验一&#xff1a;数据库的管理 1、假设SQL Server服务已启动&#xff0c;并以Administrator身份登录计算机&#xff08;文件名称自定&#xff09;&#xff1b;请分别使用Management界面方式和T-SQL语句实现以下操作&#xff1a; 1) 要求在本地磁盘D创建一个学生-课程数据库…

网络编程懒人入门(二):快速理解网络通信协议(下篇)

转自即时通讯网&#xff1a;http://www.52im.net/ 原作者&#xff1a;阮一峰(ruanyifeng.com&#xff09;&#xff0c;本文由即时通讯网重新整理发布&#xff0c;感谢原作者的无私分享。 1、前言 本文上篇《网络编程懒人入门(一)&#xff1a;快速理解网络通信协议&#xff0…

为什么说逻辑回归LR是线性分类器?

问题描述&#xff1a;为什么说逻辑回归LR是非常典型的线性分类器&#xff1f; 首先&#xff0c;我们要弄明白区分线性与非线性分类器的标准是什么&#xff1f;是决策边界&#xff08;Decision Boundary&#xff09; 以二分类&#xff08;LR可以用于多分类&#xff09;为例进行…

【数据库实验课堂】实验二 使用SQL Server管理数据表

实验二 使用SQL Server管理数据表&#xff1a; 1、请在指定数据库内完成以下内容&#xff1a; 1) 依据数据表的结构创建相对应的数据表&#xff0c;表结构如下所示&#xff1b; **学生信息表&#xff08;student&#xff09;**字段名称 字段类型及长度 说明 备注 S…

5, Data Augmentation

Intro 这是深度学习第5课 在本课程结束时&#xff0c;您将能够使用数据增强。 这个技巧让你看起来拥有的数据远远超过实际拥有的数据&#xff0c;从而产生更好的模型。 Lesson [1] from IPython.display import YouTubeVideo YouTubeVideo(ypt_BAotCLo, width800, height45…