虽然代码短,但是还是有很多地方值得学习的。 动规,主要还是状态转移方程。还不会写,参考 http://blog.youkuaiyun.com/tclh123/article/details/6286833。
同时还要注意避免重复,一个是通过从最大的硬币开始,50,25,10,5,1,dp里面的for循环也是从i=a到i=0,然后vis数组标记,避免重复计算,节省时间。
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 7490
using namespace std;
int coin[]= {50,25,10,5,1};
int vis[5][MAXN],d[5][MAXN];
int dp(int a,int money)
{
if(money==0)
return 1;
if(vis[a][money])
return d[a][money];
vis[a][money]=1;
int ans=0;
for(int i=a; i<5; i++)
if(money>=coin[i])
ans+=dp(i,money-coin[i]);
d[a][money]=ans;
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int money;
while(scanf("%d",&money)!=EOF)
{
// memset(vis,0,sizeof(vis));
cout<< dp(0,money)<<endl;
}
return 0;
}