• 物资调度


    物资调度

    时间限制: 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;
    }
    
  • 相关阅读:
    [转]org.apache.poi3.1.7 Excle并发批量导入导出,格式设置方式需要修改
    [转]POI使用HSSF,XSSF,SXSSF三种方式
    [转]idea maven项目dependencies红线 解决办法
    mysqlGTID主从同步出现1236错误问题
    MySQL日志:slow query log
    telnet 去掉用户名和密码
    [PHP] 装饰器模式-结构型设计模式
    [GO] 变参函数-GO中函数传递变长参数
    [PHP] 数据映射器模式-结构型设计模式
    [GO-FLY] GO-FLY客服实现浏览器消息提示音
  • 原文地址:https://www.cnblogs.com/lanaiwanqi/p/10445727.html
Copyright © 2020-2023  润新知