zoukankan      html  css  js  c++  java
  • 河南省第七届大学生程序设计竞赛 问题 A: 物资调度【简单dfs】

    题目描述

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

     

    一方有难,八方支援。现在已知有N个地方分别有A1,A2,….,An个物资可供调配。目前灾区需要物资数量为M。

    现在,请你帮忙算一算,总共有多少种物质调度方案。假设某地方一旦被选择调配,则其物资数全部运走。

    输入

    第一行: K     表示有K组测试数据。

    接下来对每组测试数据有2行,第1行:  N  M

                  第2行:A1  A2 ……  An 

    输出

    对于每组测试数据,输出一行:物资调度的总方案数

    样例输入

    2
    4 4
    1 1 2 2
    4 6
    1 1 2 2
    

    样例输出

    3
    1
    

    提示


    2≤K≤8     1<N≤100   1<M≤1000     1≤ Ai≤1000   



    所有数据都是正整数。输入数据之间有一个空格。假设给定的数据至少有一种调度方案。 

     
    简单的dfs,需要注意的是每次搜素组合的起始点。~~可是写练习的时候为什么就写不出来呢~
    #include<stdio.h>
    #include<string.h>
    #define N 1100
    int book[N];
    int n,m,ans;
    int w[N];
    
    void dfs(int x,int s)
    {
        int i;
        if(s == m)//组合满足条件,总数加1 
        {
            ans ++;
            return;
        }
        if( s > m)//剪枝条件 
            return;
        for(i = x;i<= n;i ++)//注意每次开始不是从1开始,而是从当前位置往后搜索 
        {
            if(!book[i])
            {
                book[i] = 1;
                dfs(i,s+w[i]);
                book[i] = 0;
            }
        }
        
    }
    
    int main()
    {
        int t,i;
        scanf("%d",&t);
        while( t--)
        {
            scanf("%d%d",&n,&m);
            for(i = 1;i <= n; i ++)
                scanf("%d",&w[i]);
            ans = 0;
            memset(book,0,sizeof(book));
            dfs(1,0);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7412501.html
Copyright © 2011-2022 走看看