空运物资

问题 : 空运物资

时间限制: 1 Sec   内存限制: 128 MB
提交: 22   解决: 7
[ 提交][ 状态]

题目描述

在灾区,多数人已经受伤,缺水,少食物,精神处在崩溃的边缘。很多人的生存条件仅能维持几天。灾民需要帐篷、衣物、食品和医疗器材、药品等物资。14日上午,中央军委委员、空军司令员许其亮组织召开空军首长办公会,将空军下一步救灾重点确定为抢救伤员、空投、空运。空军各部队都派出多架运输机,准备向灾区空运急需物品。
现在已知四种打包过的急需物品重量分别为C1, C2, C3,C4 ,数量分别为M1,M2,M3,M4包。一架运输机的载重量为W, 现在各部队关心将一架运输机装满共有多少种运载方案,以便调度进行空运。
比如C={ 100, 200, 500, 1000}, M={ 3, 2, 3, 1 }, W=1000, 一共有4种运载方案:
1000=100+100+100+200+500
1000=100+200+200+500
1000=500+500
1000=1000

输入

第一行: C1 C2 C3 C4 N    其中N为空运的部队数
接下来n行: Mi1 Mi2 Mi3 Mi4 Wi    表示各运载部队需空运的4种物品数量Mi和各自运输机的载重量Wi i=1,2,….. , N

输出

输出有N行,表示各部队运载物品的方案总数,保证答案在10000范围内

【约束条件】
(1)0< Cj <= 1000 0 <= Mij <= 500 i =1,2,….. , N j =1,2,3,4
(2)N<=1000 0 < Wi <= 100000 i =1,2,….. , N
(3)时间限制: 1000MS

 

样例输入

1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900

样例输出

4

27

题目大意:给出每个装载机的载重和每个货物的所需运输量,还有货物的总共的运输量,现在要求输出对于一个装载机运输完

货物的方案数。

解题思路:母函数算法解决。母函数的核心思想是利用多项式想乘的方法,以x的幂数来代替当前所选物品的总和,用x的系数来

表示方案数,最后输出系数即可。

例如:

对于该式子(1+x^1+x^2+x^3+x^4)*(1+x^1+x^2+x^3+x^4)*(1+x^1+x^2+x^3+x^4)*(1+x^1+x^2+x^3+x^4)

展开的最后结果中,x^10所对应的系数即可表达1,2,3,4,这四个数字组合出10的方案数

代码:

#include<stdio.h>

#include<string.h>

int c1[100010],c2[100010];

int main()

{

   int c[10],m[10];

  int i,j,k,x,y,n;

 while(scanf("%d%d%d%d%d",&m[0],&m[1],&m[2],&m[3],&n)!=EOF)

{

       while(n--)        

     {

        scanf("%d%d%d%d",&c[0],&c[1],&c[2],&c[3]);

       scanf("%d",&x);

       memset(c1,0,sizeof(c1));

       memset(c2,0,sizeof(c2));

       for(i=0,j=0;i<=c[0];i++,j+=m[0])   

         c1[j]=1;

      for(i=1;i<4;i++)//表示多项式的第几项

      {

          for(j=0;j<=x;j++)//表示每项中幂数不同的项

       {

            if(c1[j]==0)  

              continue;

          for(k=0;k+j<=x&&k<=c[i];k++)//对其他的项以此想乘,保留幂数不同项的系数                                     c2[k*m[i]+j]+=c1[j];

    }

          for(j=0;j<=x;j++)//保留系数

         {

          c1[j]=c2[j];

         c2[j]=0;

         }

     }

           printf("%d\n",c1[x]);//输出幂数是x时的组合方案数

     }

  }

return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_39259536/article/details/80125058