meaning:就是给钱的种数(无线多张),钱的总金额,问有多少种组成办法可以组成这个金额。
thinking:直接DP,想状态转移方程,dp[i][j],表示用i种面额最多可以拼成总额为j的种数。
然后dp[i][qq[i]]初始化都为1,
当qq[i]>j时,dp[i][j]=dp[i-1][j]+dp[i][j-qq[i]],2个加分别是取这个面额和不取这个面额的意思
代码:
/*
ID: me
PROG: money
LANG: C++
*/
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int n;
long long dp[30][10050];
int qq[30];
int main(){
freopen("money.in","r",stdin);
freopen("money.out","w",stdout);
int i,j,k,l,f1,f2,f3,t1,t2,t3;
int v,n,m;
memset(dp,0,sizeof(dp));
memset(qq,0,sizeof(qq));
cin >> v >> n;
for(i=1;i<=v;i++){
cin >> qq[i];
dp[i][qq[i]]=1;
}
for(i=1;i<=v;i++)
for(j=1;j<=n;j++){
if(j>qq[i])
dp[i][j]=dp[i][j-qq[i]]+dp[i-1][j];
else
dp[i][j]+=dp[i-1][j];
}
//for(i=1;i<=v;i++)
// for(j=1;j<=n;j++)
// cout << "i= " << i << " j= " << j << " " << dp[i][j] << endl;
cout << dp[v][n] << endl;
return 0;
}