题解
完全背包问题,讨论的是放完的方案数,只要把各种情况加起来就好了。
我给了一个2维空间的答案比较直观,可以压缩到一维,但需要推一下公式。
Code
// head files excluded
using namespace std;
int n,m,k;
long long f[2][10002];
int cot[26];
int main(void){
cin>>m>>n;
for(int i=0;i<m;i++) cin>>cot[i];
f[1][0] = f[0][0]= 1;
int turn;
for(int i=0;i<m;i++){
turn = i&1;
memset(f+turn,0,sizeof(long long)*(n+1));
f[turn][0]=1;
for(int j=1;j<=n;j++){
for(int k=0;k*cot[i]<=j;k++){
f[turn][j] += f[ 1-turn ][ j-k*cot[i]] ;
}
}
}
cout<<f[turn][n]<<endl;
return 0;
}