zoukankan      html  css  js  c++  java
  • 物资调度

    物资调度

    时间限制: 1 Sec 内存限制: 128 MB


    题目描述

    某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷、衣物、食品和血浆等物资。可通往灾区的道路到处都是塌方,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

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

    题目类型 :

    母函数

    题意概括 :

    输入n个整数和一个m,用这n个整数组合m问一共有多少中组合

    解题思路 :

    利用母函数的思想,计算出所有的组合数

    代码:

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    #include <stdlib.h>
    #include <queue>
    
    using namespace std;
    
    int main ()
    {
        int t,n,m,i,j,k;
        int val[110],sum[1100],b[1100];
        scanf("%d",&t);
        while (t --)
        {
            scanf("%d%d",&n,&m);
            for (i = 1; i <= n; i ++)
                scanf("%d",val+i);
            memset(sum,0,sizeof(sum)); sum[0] = 1;
            for (i = 1; i <= n; i ++)
            {
                memset(b,0,sizeof(b));
                for (j = 0; j <= 1; j ++)
                    for (k = 0; k+j*val[i] <= m; k ++)
                        b[k+j*val[i]] += sum[k];
                memcpy(sum,b,sizeof(b));
            }
            printf("%d
    ",sum[m]);
        }
        return 0;
    }
    
  • 相关阅读:
    Oracle 删除重复数据的几种方法
    12.25模拟赛T3
    java实现第五届蓝桥杯圆周率
    java实现第五届蓝桥杯武功秘籍
    Oracle 审计初步使用
    [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树
    ORA-12012 Error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_<NN> in 12.2.0 Database
    12.25模拟赛T2
    java实现第五届蓝桥杯写日志
    java实现第五届蓝桥杯李白打酒
  • 原文地址:https://www.cnblogs.com/lanaiwanqi/p/10445727.html
Copyright © 2011-2022 走看看