题目链接:

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+剪枝)相关推荐

  1. nyoj 1249 物资调度(DP)

    物资调度 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70%以上的路面损坏,桥梁全部被毁.国家立即启动应急预案,展开史上最大强度非 ...

  2. 河南省ACM程序设计 物资调度

    物资调度 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70%以上的路面损坏,桥梁全部被毁.国家立即启动应急预案,展开史上最大强度非作战空 ...

  3. NYOJ_1294_物资调度【搜索】

    /* \物资调度 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌 ...

  4. 物资调度(01背包+求方案数)

    物资调度 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70 ...

  5. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  6. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  7. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  8. 【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 ...

  9. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

最新文章

  1. R语言观察日志(part2)--preProcess函数
  2. c++ list 修改_ggplot2 修改图例的一些操作
  3. SiteServer CMS 新版本 V6.15(2020年6月1日发布)
  4. CF1375G. Tree Modification(贪心,黑白染色)
  5. 今天会议的召开,和你有关系吗?
  6. Bootstrap3 表单控件的状态
  7. 查看指定进程io状态的iotop命令
  8. excel2016打开后空白不显示内容的解决办法
  9. 超全Inventor 3d模型素材网站整理
  10. c语言自定义结构,C语言如何定义结构体
  11. BUCK电路分析(一)
  12. Java、JSP报刊订阅管理系统的设计与实现
  13. Oozie 工作流定义详解【转】
  14. 2020-03-19
  15. 无人机技术的发展与应用
  16. Java计算税后工资和税前工资推算
  17. stack、queue和priority_queue
  18. HttpClient访问https,设置忽略SSL证书验证
  19. 计算机丢失sspicli,MS16-047:SAM 和 LSAD 远程协议安全更新程序说明:2016 年 4 月 12 日...
  20. 拜日式精准引导词_在家练瑜伽,常用英文单词了解一下?(三)

热门文章

  1. 介绍一下鸟车:折叠车中的贵族--birdy
  2. win10系统无法激活的解决方法
  3. Docker集群部署管理
  4. ue4云渲染——像素流送实践
  5. 小米手机Android统异常耗电,小米9耗电异常,很多米粉出现这个问题
  6. Heic图片转换精灵-Heic图片高清转换JPG/PNG/BMP方法
  7. 微软Power Automate Desktop在唱哪一出?符合一款主流RPA工具的要求吗?
  8. 华为mate40pro+和华为mate40RS保时捷有什么区别
  9. 存储 -多台机器共用一个LUN
  10. 微信一手机号可注册两账号