TMOOC-1692-分西瓜

题目

描述

今天是阴历七月初五,首师大附中信息社团队员GDC的生日。GDC正在和SCX、WXY在首师大附中集训。他想给这两位兄弟买点什么庆祝生日,经过调查,GDC发现SCX和WXY都很喜欢吃西瓜,而且一吃就是一堆的那种,GDC立刻下定决心买了一堆西瓜。当他准备把西瓜送给SCX和WXY的时候,遇到了一个难题,WXY和SCX不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小。每个西瓜的重量已知,你能帮帮他么?

输入

输入多组测试数据(<=1500)。数据以EOF结尾,第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量。

输出

输出分成两堆后的质量差。

输入示例

5
5 8 13 27 14

输出示例

3

思路

要使两边之差较小,也就是要尽量让两边的数挨近sum/2(sum为总量)就可以了。只需做一个以sum/2为容量的背包即可。另一边的重量是sum-dp[sum/2]。
那么,最终的差就是:sum-dp[sum/2]-(dp[sum/2])=sum-dp[sum/2]*2;

DFS做法

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define max(a,b) a>b?a:b
using namespace std;
int n,a[21],ans,sum[21],V;
void dfs(int i,int cnt){
    if(i==0){
        ans=max(ans,cnt);
        return ;
    }
    if(ans==V||cnt+sum[i]<=ans)return ;
    if(cnt+a[i]<=V)dfs(i-1,cnt+a[i]);
    dfs(i-1,cnt);
}
int main(){
    while(cin>>n&&n){
        ans=0;
        for(int i=1;i<=n;i++)cin>>a[i],sum[i]=sum[i-1]+a[i];
        V=sum[n]/2;
        dfs(n,0);
        cout << (sum[n]-2*ans) << endl;
    }
    return 0;
}

DP做法

#include<iostream>
#include<cstring>
using namespace std;
int n,w[21],dp[200001],v,sum=0;
int max(int x,int y){return x>y?x:y;}
int main(){
    while(cin>>n){
        sum=0;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)cin>>w[i],sum+=w[i];
        v=sum/2;
        for(int i=1;i<=n;i++){
            for(int j=sum;j>=w[i];j--){
                dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
            }
        }
        cout << (sum-dp[v]*2) << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/dmoransky/p/10742619.html

时间: 2024-10-03 22:29:26

TMOOC-1692-分西瓜的相关文章

机器学习 demo分西瓜

周老师的书,对神经网络写了一个小的Demo 是最简单的神经网络,只有一层的隐藏层. 这次练习依旧是对西瓜的好坏进行预测. 主要分了以下几个步骤 1.数据预处理 对西瓜的不同特性进行数学编码表示(0~1),我是直接编了对应数字.含糖量已经是一个0~1之间的数,所以就没有进行处理 青绿  1 乌黑 0.5 浅白  0 蜷缩  1 稍蜷 0.5 硬挺  0 浊响  1 沉闷 0.5 清脆  0 清晰  1 稍糊 0.5 模糊  0 凹陷  1 稍凹 0.5 平坦  0 硬滑  1 软黏  0 2.训练

分西瓜(DFS)

描述今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜.当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小.每个西瓜的重量已知,你能帮帮他么? 输入 多组测试数据(<=1500).数据以EOF结尾第一行输入西瓜数量N (

大集训的第二个小总结

时间从8.2又到了8.9号,过去了一周,又考了5场试,又有学长来讲东西,但也有不少福利,先是分西瓜,后来又是分零食,昨天又分了香蕉,不错不错. 照例先说一下考试,这次数据还没下来,回头补吧. 第一次,16名. 第二次,6名. 第三次,1名. 第四次,25名. 第五次,20名. 好吧,前期发育猥琐,后期打的不好.最终刨去两个高一大佬12名,还是没进前十,算了,习惯这种心碎的感觉了. 同桌Q某犇说我贪得无厌,或许吧,但我觉得如果有一天我真的不去追求更高的能力恐怕我就会去退役了吧. 知识方面比起上次貌

绝路上的桥

<绝路上的桥>文\伯爵在城堡 记得小时候,我偷过一次东西.那是我有生以来第一次"犯罪",可能也是最后一次. 那时,我尚住在乡下,跟爷爷奶奶一起生活.周围有几户人家,小孩比我大几岁,都已上学.每天早晨,我能透过雾蒙蒙的玻璃窗,看见几个男生女生赶着上学的身影,到了下午,他们又从这条路上放学回家.我那时的愿望,就是能跟他们在一起玩,哪怕是坐在旁边听他们聊天,我都会觉得特别高兴.可是他们从来都不带我.不仅是因为他们的年龄比我大,更重要的是他们的游戏(足球.篮球.骑车.滑板),我都无

NY 325 zb的生日

假设所有西瓜重 Asum,所求的是用 Asum / 2 的背包装,最多装下多少. 刚开始用贪心作的,WA.后来用01背包,结果TLE,数据太大.原来用的是深搜! dfs(int sum, int i) 表示当前装已了 sum,对第 i 个进行决策. 用时1200多MS,不知道大牛们60MS是怎么搞的,泥煤,20倍!以后再优化吧. 代码如下: #include<iostream> #include<cstdio> #include<math.h> #include<

一个简单的文件管理程序

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

40斤西瓜3人分,求分法

该题最核心的思路是西瓜一共40斤,只要3个人分到的西瓜斤数总和等于40即可,所以,即有如下解决方法: <?php $aa = range(1,40); $bb = array(); foreach($aa as $k=>$val){   foreach($aa as $v){     foreach($aa as $vl){       $sum = $val+$v+$vl;       if($sum == 40){         $bb[$k][0] = $val;         $b

[luogu U8984][新创无际夏日公开赛] 冰精冻西瓜 [树状数组]

题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的冷气的寒冷程度放大或缩小,每条西瓜蔓放大/缩小冷气寒冷程度的能力值为Wi,表示冷气经过它后,寒冷程度值x会变为x*wi.每个西瓜也有一个寒冷程度值,炎热的夏日,所有西瓜的寒冷程度值初始都为0. 琪露诺会做出两种动作: ①

西瓜书第二章--模型评估与选择

2.1 经验误差与过拟合 错误率:错分样本的占比 精度:分对样本的占比,与错误率是互补的. 误差:样本真实输出与预测输出之间的差异.学习器在训练集上的误差称为训练误差或经验误差,在新样本上的误差称为泛化误差. 由于事先并不知道新样本的特征,我们只能努力使经验误差最小化: 很多时候虽然能在训练集上做到分类错误率为零,但多数情况下这样的学习器并不好 过拟合:学习器把训练样本学习的“太好”,将训练样本本身的特点 当做所有样本的一般性质,导致泛化性能下降: 解决措施:1.优化目标加正则项 :2.earl

c# partial 分部类和分部方法

一.partial 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.修饰符不可用于委托或枚举声明中. 二.分部类 在以下几种情况下需要拆分类定义: 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理. 使用自动生成的源时,无需重新创建源文件便可将代码添加到类中. Visual Studio 在创建 Windows 窗体.Web 服务包装器代码等时都使用此方法.