问题 : 空运物资
时间限制: 1 Sec 内存限制: 128 MB提交: 22 解决: 7
[ 提交][ 状态]
题目描述
现在已知四种打包过的急需物品重量分别为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;
}