AcWing 1371. 货币系统
原题链接
简单
作者:
不幸到吃土
,
2025-01-02 20:44:06
,
所有人可见
,
阅读 1
//本题为计数类DP
//状态表示:f(i,j)表示从前0~i种选,货币总面值为j
/*
状态计算:以第i种货币选的数量为划分,分别划分为0、1、2、...、INF种
f(i,j) = f(i-1,j) 0
f(i,j) = f(i-1,j-w[i]) 1
f(i,j) = f(i-1,j-2*w[i]) 2
......
可发现:f(i,j-w[i]) = f(i-1,j-w[i]) + f(i-1,j-2*w[i]) + f(i-1,j-3*w[i]) + ...
故最终状态转移方程:f(i,j) = f(i-1,j) + f(i,j-w[i])
*/
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 30 , M = 10010;
int n,m;
int w[N];
LL f[N][M];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
f[0][0] = 1; //初始啥都不选即为一种选法
//开始DP
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
f[i][j] = f[i-1][j];
if(j>=w[i]){
f[i][j] += f[i][j-w[i]];
}
}
}
printf("%lld\n",f[n][m]);
return 0;
}