【DFS】NYOJ-325-zb的生日
【题目链接:NYOJ-325】
一道以我名字命名的题目,难道要我生日的时候再A?
思路:依旧深搜,但这个问题应该有一个专有名词吧,看别的博客说是 “容量为 sum/2 的背包问题”,不懂。。。
// abs() 对应头文件 stdlib.h 返回int参数
// fabs() 对应头文件 math.h 返回double参数
#include<cstdio>
#include<cstring>
#include<stdlib.h>
int W[],sum,m,n;
void dfs(int cur,int total){
int t =abs(sum - total * );
if(t < m)
m = t;
if(cur == n){
// int t =abs(sum - total * 2);
// if(t < m)
// m = t;
return;//递归边界
}
if(total > sum / ){ //剪枝
// int t =abs(sum - total * 2);
// if(t < m)
// m = t;
return;
}
dfs(cur + ,total + W[cur]); //结点分支。加,右分支
dfs(cur + ,total); //节点分支。不加,左分支
}
int main(){
while(~scanf("%d",&n)){
memset(W,,sizeof(W));
sum = ;
m = ;
for(int i = ;i < n;i++){
scanf("%d",&W[i]);
sum += W[i];
}
dfs(,);
printf("%d\n",m);
}
return ;
}
渐渐对搜索有了一些认识,刚开始完全无头绪,要多练习,加油!
最优解:
也就是动脑筋剪枝。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int a[];
int s[];
int n;
int V;
int ans; void DFS(int i,int v)
{
if(i==n+)
{
ans=max(ans,v);
return;
}
//如果背包已经装满,则不再考虑其他情况。
//如果背包中已有物品加上现有可选物品的总重量都不大于已知的最优解,则剪枝
if(ans==V||v+s[n]-s[i-]<=ans)
return;
if(a[i]+v<=V)
{
DFS(i+,v+a[i]);
}
DFS(i+,v);
} int main()
{
while(scanf("%d",&n)==)
{
s[]=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
s[i]=s[i-]+a[i];
}
V=s[n]/;
ans=;
DFS(,);
ans=s[n]-ans-ans;
printf("%d\n",ans);
}
return ;
}
【DFS】NYOJ-325-zb的生日的更多相关文章
- nyoj 325 zb的生日(dfs)
描述今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb ...
- nyoj 325 zb的生日
01背包 zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄 ...
- nyoj 325——zb的生日——————【dp】
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- nyoj 0325 zb的生日(dp)
nyoj 0325 zb的生日 zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集 ...
- NYOJ之题目325 zb的生日
-------------------------------------- 刷一辈子水题... AC代码: import java.util.Scanner; public class Main { ...
- NY 325 zb的生日
假设所有西瓜重 Asum,所求的是用 Asum / 2 的背包装,最多装下多少. 刚开始用贪心作的,WA.后来用01背包,结果TLE,数据太大.原来用的是深搜! dfs(int sum, int i) ...
- zb的生日
http://acm.nyist.net/JudgeOnline/problem.php?pid=325 zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 ...
- nyoj zb的生日【背包型DFS/选or不选】
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- nyoj325 zb的生日(DFS)
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- zb的生日(暴搜dfs)
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
随机推荐
- matlab中函数fscanf
matlab中函数fscanf matlab中函数fscanf在文件读取方面的实例如下: 从文件中有格式地读数据 fscanf 语法1:[a,count]=fscanf(fid,format,size ...
- Eclipse通过集成svn实现版本控制
Eclipse通过集成svn即安装subclipse插件 前面已经讲解过了,这就不说了,作为测试人员继续总结下Eclipse通过集成svn实现的版本控制 首次从SVN代码库中导出代码文件: 1.右键工 ...
- ZOJ 2563 Long Dominoes(状压DP)
给定一个m*n的方格子,要求用3*1的骨牌去覆盖,骨牌可以用横放或者竖放,问最终有多少种放置方式,将其铺满. 分析:由于最多30行,每行最多9列,所以可以按行来dp,设计每行的状态从而进行转移,考虑每 ...
- lintcode 中等题:Min stack 最小栈
题目 带最小值操作的栈 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 解题 可以定义 ...
- nginx/apache/php隐藏http头部版本信息的实现方法
有时候我们需要隐藏我们的服务器版本信息,防止有心人士的研究,更安全,这里介绍下在nginx/apache/php中如何隐藏http头部版本信息的方法. nginx隐藏头部版本信息方法 编辑nginx. ...
- React-Flux 介绍及实例演示
一.Flux架构 二.例子 1.TodoApp.react.js /** * Copyright (c) 2014-2015, Facebook, Inc. * All rights reserved ...
- WCF入门(十)---WCF事务
事务处理在WCF(Windows Communication Foundation)是一套遵循一些性质,统称为ACID的操作.这里,如果一个操作出现故障,整个系统就会自动失败.如网上订单生成,就可能使 ...
- 65. Valid Number
题目: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " = ...
- sql中exists,not exists的用法
exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(select ...
- Java API —— 多线程
1.多线程概述 1)进程: 正在运行的程序,是系统进行资源分配和调用的独立单位. 每一个进程都有它自己的内存空间和系统资源. 2)线程: ...