地址
http://acm.hdu.edu.cn/showproblem.php?pid=2079
定位
排列组合问题
母函数
分析
物品种类数 k ,第
i 行输入:物品价值 v[i] ,物品数量 n2[i] 。母函数
g(x)=(1+xv[1]+...+xn2[1]v[1])...(1+xv[i]+...+xn2[i]v[i])...(1+xv[k]+...+xn2[k]]v[k])
代码
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- using namespace std;
- int a[1001],b[1001];
- int v[9],n1[9],n2[9];
- /*************************************************
- Function: GenerateFunc(int N,int P)
- Description: 生成函数系数计算
- Input: int N : 相乘的因子个数
- int P : 待求的最大指数
- Output: void
- Return: void
- Others: 修改的全局变量 a[] b[]
- 只读的全局变量 v[] n1[] n2[]
- *************************************************/
- void GenerateFunc(int N,int P) {
- memset(a,0,sizeof(a));
- a[0]=1;
- for(int i=0; i<N; i++) {
- memset(b,0,sizeof(b));
- for(int j=n1[i]; j<=n2[i]&&j*v[i]<=P; j++) {
- for(int k=0; k+j*v[i]<=P; k++) {
- b[k+j*v[i]]+=a[k];
- }
- }
- memcpy(a,b,sizeof(b));
- }
- }
- int main() {
- int T;
- memset(n1,0,sizeof(n1));
- scanf(”%d”,&T);
- while(T–) {
- int n,k;
- scanf(”%d %d”,&n,&k);
- for(int i=0; i<k; i++) {
- scanf(”%d %d”,&v[i],&n2[i]);
- }
- GenerateFunc(k,n);
- printf(”%d\n”,a[n]);
- }
- }
性能
Exe.Time | Exe.Memory | Code Length | Language |
---|---|---|---|
15MS | 1872K | 1168B | c++ |