C(i,j)表示i使用前j个数的组合
C(i,j) = C(i,j-1)+C(i-w[j],j-1)+C(i-2*w[j],j-1)+C(i-3*w[j],j-1)+.....
有上式得C(i-w[j],j) = C(i-w[j],j-1)+C(i-2*w[j],j-1)+C(i-3*w[j],j-1)+.....
所以C(i,j) = C(i,j-1)+C(i-w[j],j)
当自然数是1234567。。。时,问题等价于整数划分问题
#include<fstream>
#include<iostream>
#define MAXNUM 7
using namespace std;
int f[MAXNUM][MAXNUM];
int w[MAXNUM];
int main(){
int n,b,i,j;
ifstream fin("input.txt");
fin >> n >> b;
for(i=0;i<b;i++)
fin >> w[i];
cout << sizeof(f) <<endl;
memset(f,0,sizeof(f));
for(j=0;j<b;j++)
f[0][j] = 1;
for(j=0;j<b;j++)
for(i=1;i<=n;i++){
if(j-1>=0)
f[i][j] += f[i][j-1];
if(i-w[j]>=0)
f[i][j] += f[i-w[j]][j];
}
cout<<f[n][b-1]<<endl;
}