5-分西瓜差最小(背包 || dfs)
/* zb立刻下定决心买了一堆西瓜。当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小。每个西瓜的重量已知,你能帮帮他么?
输入
多组测试数据(<=1500)。数据以EOF结尾
第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
输出
输出分成两堆后的质量差
样例输入
5
5 8 13 27 14
样例输出
3
*/
方法一:可以转为背包:
//差距最小肯定是越接近一半是最好的,转化为01背包
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int p[100025];
int a[100025]; //题目太坑了,不是说了0~20吗,但非要开这个数量级才能过 int main(){
int n;
while(scanf("%d", &n) != EOF){
memset(p, 0, sizeof(p)); //每次撒比的忘记清零
double sum = 0;
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
sum += a[i];
}
int v = sum / 2;
for(int i = 0; i < n; i++){
for(int j = v; j >= a[i]; j--)
if(p[j - a[i]] + a[i] > p[j])
p[j] = p[j - a[i]] + a[i];
} printf("%d\n", ((int)sum - p[v] * 2));
/*sum为double型 %d 不能输出 printf除了第一个参数,后面的是void*型的,可以为任何类型数据。
但是在执行printf函数时,先把所有参数按从右向左的顺序压入堆栈,参数进入堆栈后就是连续储存了,然后再按照printf第一个参数的格式来处理数据,
由于数据连续,所以只要前面一个数据没有对齐,后面的都会出错。用“%d”来输出double型的数据,相当于丢弃了四个字节,这被丢弃的四个字节就被
归到后面的数据去了,有可能就会导致后面的数据出错 */
} return 0;
}
方法二:dfs
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
int gua[22];
int mincha;
int n;
int maxsum; void dfs(int k, double ma){ //目前在k的位置往后搜, 和为ma
if(k == n)
return ;
if(abs(maxsum - ma * 2) < mincha){
mincha = abs(maxsum - 2 * ma);
}
dfs(k + 1, ma + gua[k + 1]); //分为两种情况,第k + 1个元素放进去和不放进去
dfs(k + 1, ma);
} int main(){ while(scanf("%d", &n) == 1){
mincha = 0x3fffffff;
maxsum = 0;
for(int i = 0; i < n; i++){
scanf("%d", &gua[i]);
maxsum += gua[i];
}
dfs(0, 0);
printf("%d\n", mincha);
} return 0;
}
5-分西瓜差最小(背包 || dfs)的更多相关文章
- 分西瓜(DFS)
描述今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb ...
- HDU 1171 Big Event in HDU【01背包/求两堆数分别求和以后的差最小】
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- 如何交换两个等长整形数组使其数组和的差最小(C和java实现)
1. 问题描述: 有两个数组a,b,大小都为n,数组元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小. 2. 求解思路: 当前数组a和数组 ...
- Codeforces Round #448 (Div. 2) A. Pizza Separation【前缀和/枚举/将圆(披萨)分为连续的两块使其差最小】
A. Pizza Separation time limit per test 1 second memory limit per test 256 megabytes input standard ...
- UVA 562 Dividing coins 分硬币(01背包,简单变形)
题意:一袋硬币两人分,要么公平分,要么不公平,如果能公平分,输出0,否则输出分成两半的最小差距. 思路:将提供的整袋钱的总价取一半来进行01背包,如果能分出出来,就是最佳分法.否则背包容量为一半总价的 ...
- IT公司100题-32-交换元素,使数组差最小
问题描述: 有两个整数序列a, b,大小都为n, 序列元素的值任意整数,无序. 要求:通过交换a, b 中的元素,使得sum(a)-sum(b),差最小. 例如: var a=[80, 40, 60, ...
- [Swust OJ 465]--吴奶奶买鱼(0-1背包+dfs)
题目链接:http://acm.swust.edu.cn/problem/465/ 还有一道题只是描述不一样,方法一模一样(http://acm.swust.edu.cn/problem/644/) ...
- 通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
题目描述: 有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小.例如:var a=[100,99,98, ...
- PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS
PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...
随机推荐
- php如何判断IP为有效IP地址
不需要正则表达式来判断,因为在php5.2.0之后,有专门的函数来做这个判断了. 判断是否是合法IP if(filter_var($ip, FILTER_VALIDATE_IP)) { // it's ...
- seaborn分类数据可视化
转载:https://cloud.tencent.com/developer/article/1178368 seaborn针对分类型的数据有专门的可视化函数,这些函数可大致分为三种: 分类数据散点图 ...
- 使用V$SQL_PLAN视图获取曾经执行过的SQL语句执行计划
通常我们查看SQL语句的执行计划都是通过EXPLAIN PLAN或者AUTOTRACE来完成.但是这些查看方法有一个限制,它们都是人为触发而产生的,无法获得数据库系统中曾经执行过的SQL语句执行计划. ...
- react 中state与props
react 中state与props 1.state与props props是只读属性,只有在组件被实例化的时候可以赋值,之后的任何时候都无法改变该值.如果试图修改该值时,控制台会报错 only re ...
- springboot根据不同的条件创建bean,动态创建bean,@Conditional注解使用
这个需求应该也比较常见,在不同的条件下创建不同的bean,具体场景很多,能看到这篇的肯定懂我的意思. 倘若不了解spring4.X新加入的@Conditional注解的话,要实现不同条件创建不同的be ...
- 使用 SignalR与SSE(Sever sent event)向客户端推送提示信息
最近有个项目想把c/s的代码转成mvc的,这听起来并不困难. 如果UI和业务逻辑良好分离了的话,不会花太多的功夫,应该多数的内容都能重复利用. 但在实际的操作过程中,发现业务逻辑代码和UI提示全是混在 ...
- 2.vo传参模式和ModerDriven传参模式
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html Copy上面的myStruts2项目,改名为myStruts2Vo项目.作如 ...
- Qt 信号槽
Qt4与Qt5的信号槽有些不同: 1. Qt4的槽函数必须使用slots关键字声明,而Qt5中已经不再需要了,槽函数可以是任何能和信号关联的成员函数. 2. Qt4指定信号函数和槽函数需用SIGNAL ...
- 一个取消事件的简单js例子(事件冒泡与取消默认行为)
先上代码: <div id='outer' onclick='alert("我是outer")'> <div id="middle" oncl ...
- js数组类型判断与数据类型判断回顾
判断一个对象是否是数组方法有多种: 一.Array.isArray()函数 在ECMAScript5中可以通过Array.isArray()来做这件事: Array.isArray({}); //fa ...