老罗课其实讲得很好,真的,老罗写书的话我可能真的会买
找出状态转移方程然后打表即可
#include <iostream> #include <cstring> using namespace std; const int maxn=4000; int dp[260][110]; //钱数 硬币数 int coins[5]={1,5,10,25,50}; void print_dp(){ dp[0][0]=1; for(int t=0;t<5;t++){ for(int k=1;k<=100;k++){ for(int i=coins[t];i<=250;i++){ dp[i][k] += dp[i-coins[t]][k-1]; } } } } int ans[251]={0}; void cnt(){ for(int k=1;k<=250;k++) for(int i=1;i<=100;i++){ if(dp[k][i]) ans[k]+=dp[k][i]; } } int main(){ // freopen("in.txt","r",stdin); // freopen("out1.txt","w",stdout); memset(dp,0,sizeof(dp)); print_dp(); cnt(); int money; while(cin>>money){ if(money==0) cout<<1<<endl; else cout<<ans[money]<<endl; } return 0; }