NYOJ 1249 物资调度(DFS+剪枝)
题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=1249
描述
某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷、衣物、食品和血浆等物资。可通往灾区的道路到处都是塌方,70%以上的路面损坏,桥梁全部被毁。国家立即启动应急预案,展开史上最大强度非作战空运行动,准备向灾区空投急需物资。
一方有难,八方支援。现在已知有N个地方分别有A1,A2,….,An个物资可供调配。目前灾区需要物资数量为M。
现在,请你帮忙算一算,总共有多少种物质调度方案。
假设某地方一旦被选择调配,则其物资数全部运走。
- 输入
-
输入一个组数T。(0<T<10)
之后为N,M含义分别如题目描述。(0<N<=100,0<M<=1000)
之后有N个数字A1,A2,….,An表示N个地方每个地方的物资数。(0<Ai<=1000) - 输出
- 对于每组测试数据,输出一行:物资调度的总方案数
- 样例输入
-
2 4 4 1 1 2 2 4 6 1 1 2 2
- 样例输出
-
3 1
- 来源 第七届河南省程序设计大赛 题意描述: 输入物资的堆数及所需调动的物资数、每堆物资数 计算并输出调度方案数 解题思路: 可以看成是有相同牌面的不同纸牌的排列,使用DFS的话,必定需要剪枝,因为全排列10张以上的牌速度就慢的可怕了(别说100张了),所以在搜索的时候向下传递i值,意即下次尝试的时候直接从后面取就行了,这样就避免了重复取牌。另外取的时候直接判断会不会超出限度,是的话直接剪掉。详见代码。 AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 void dfs(int step,int sum,int i); 4 int ans,n,v,book[110],a[110]; 5 int main() 6 { 7 int T,i,z; 8 scanf("%d",&T); 9 while(T--) 10 { 11 scanf("%d%d",&n,&v); 12 z=0;//物资总和 13 for(i=1;i<=n;i++) 14 { 15 scanf("%d",&a[i]); 16 z += a[i]; 17 } 18 if(z <= v) 19 { 20 if(z<v) 21 printf("0\n"); 22 else 23 printf("1\n"); 24 continue; 25 } 26 27 ans=0; 28 memset(book,0,sizeof(book)); 29 dfs(1,v,1);//向下传递放牌位置,所需物资数,取牌位置 30 printf("%d\n",ans); 31 } 32 return 0; 33 } 34 void dfs(int step,int sum,int i) 35 { 36 int j; 37 if(step==n+1 || sum ==0) 38 { 39 if(sum == 0) 40 ans++; 41 return; 42 } 43 for(;i<=n;i++) 44 { 45 if(sum < a[i])//必要剪枝 46 continue; 47 if(!book[i]) 48 { 49 book[i]=1; 50 sum -= a[i]; 51 dfs(step+1,sum,i+1); 52 53 book[i]=0; 54 sum += a[i]; 55 } 56 } 57 return ; 58 }
NYOJ 1249 物资调度(DFS+剪枝)相关推荐
- nyoj 1249 物资调度(DP)
物资调度 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70%以上的路面损坏,桥梁全部被毁.国家立即启动应急预案,展开史上最大强度非 ...
- 河南省ACM程序设计 物资调度
物资调度 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70%以上的路面损坏,桥梁全部被毁.国家立即启动应急预案,展开史上最大强度非作战空 ...
- NYOJ_1294_物资调度【搜索】
/* \物资调度 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌 ...
- 物资调度(01背包+求方案数)
物资调度 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- poj2362 DFS+剪枝
题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- 【HDU - 1518】Square (经典的dfs + 剪枝)
题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...
- [DFS|剪枝] leetcode 22 括号生成
[DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...
最新文章
- R语言观察日志(part2)--preProcess函数
- c++ list 修改_ggplot2 修改图例的一些操作
- SiteServer CMS 新版本 V6.15(2020年6月1日发布)
- CF1375G. Tree Modification(贪心,黑白染色)
- 今天会议的召开,和你有关系吗?
- Bootstrap3 表单控件的状态
- 查看指定进程io状态的iotop命令
- excel2016打开后空白不显示内容的解决办法
- 超全Inventor 3d模型素材网站整理
- c语言自定义结构,C语言如何定义结构体
- BUCK电路分析(一)
- Java、JSP报刊订阅管理系统的设计与实现
- Oozie 工作流定义详解【转】
- 2020-03-19
- 无人机技术的发展与应用
- Java计算税后工资和税前工资推算
- stack、queue和priority_queue
- HttpClient访问https,设置忽略SSL证书验证
- 计算机丢失sspicli,MS16-047:SAM 和 LSAD 远程协议安全更新程序说明:2016 年 4 月 12 日...
- 拜日式精准引导词_在家练瑜伽,常用英文单词了解一下?(三)