代码参考博客:
http://blog.youkuaiyun.com/xiaofei_it/article/details/17042651
根据此题的描述可以写出生成函数为 (1+xw1)(1+xw2)(1+xw3)……(1+xwn)
//母函数即生成函数
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/*
v[i]表示该乘积表达式第i个因子的权重,对应于具体问题的每个物品的价值或者权重。
n1[i]表示该乘积表达式第i个因子的起始系数,对应于具体问题中的每个物品的最少个数,即最少要取多少个。
n2[i]表示该乘积表达式第i个因子的终止系数,对应于具体问题中的每个物品的最多个数,即最多要取多少个。
*/
//申明全局变量
#define MAX 900
int w[MAX];
int ans(int n, int v){
int val[MAX],n1[MAX],n2[MAX];
for(int i=1; i<=n; i++){
val[i]=w[i-1];
n1[i]=0;
n2[i]=1;
}
//a为计算结果,b为中间结果
int a[MAX],b[MAX];
int P = v; //P为最大的可能指数
//初始化a
memset(a,0,sizeof(a));
a[0]=1;
int cut =0;
for(int i=1; i<=n ;i++) //循环每个因子
{
memset(b,0,sizeof(b));
for(int j=n1[i];j<=n2[i]&&j*val[i]<=P;j++) //循环每个因子的每一项
for(int k=0; k+j*val[i]<=P;k++) //循环a的每一项
b[k+j*val[i]] += a[k]; //把结果加到对应位
memcpy(a,b,sizeof(b));
}
return a[v];
}
int main(){
int n,v;
scanf("%d%d",&n,&v);
for(int i=0;i<n;i++)
scanf("%d",&w[i]);
printf("%d",ans(n,v));
return 0;
}
法二
for(int i=0; i<=n; i++){
f[i][j]=f[i-1]
}