【水题】
开始想的是DP思想,愣是想不出来思路。
结果从网上见是母函数,不明所以
弄来弄去总算是过了
结果有找到了DP代码,惊喜,还是DP好弄
先上母函数的
#include <cstdio>
#include <cstring>
using namespace std;
#define N 255
#define M 105
int main()
{
int c1[N][M],c2[N][M],m[6]={0,1,5,10,25,50};
int i,j,k,t,n;
memset(c2,0,sizeof(c2));
for(i=0;i<105;i++)
c2[i][i]=1;
memset(c1,0,sizeof(c1));
for(i=2;i<6;i++)
{
for(j=0;j<255;j++)
{
for(k=0;k<105;k++)
{
for(t=0;m[i]*t+j<255&&k+t<105;t++)
{
c1[t*m[i]+j][k+t]+=c2[j][k];
}
}
}
for(j=0;j<255;j++)
{
for(k=0;k<105;k++)
{
c2[j][k]=c1[j][k];
c1[j][k]=0;
}
}
}
/* freopen("1.txt","w",stdout);
for(i=1;i<255;i++)
{
int sum=0;
for(j=1;j<=100;j++)
{
sum+=c2[i][j];
}
printf("%d\n",sum);
}
*/
while(scanf("%d",&n)!=EOF)
{
int sum=0;
for(i=1;i<=100;i++)
sum+=c2[n][i];
if(n==0) sum=1;
printf("%d\n",sum);
}
return 0;
}
再来DP的,稍等。。
#include <cstdio>
#include <cstring>
using namespace std;
#define N 300
#define M 150
int main()
{
int dp[N][M],m[6]={0,1,5,10,25,50};
int i,j,k,n;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1;i<6;i++)
{
for(j=0;j<105;j++)
{
for(k=m[i];k<255;k++)
{
dp[k][j]+=dp[k-m[i]][j-1];
}
}
}
/* freopen("1.txt","w",stdout);
for(i=1;i<255;i++)
{
int sum=0;
for(j=1;j<=100;j++)
{
sum+=c2[i][j];
}
printf("%d\n",sum);
}
*/
while(scanf("%d",&n)!=EOF)
{
int sum=0;
for(i=1;i<=100;i++)
sum+=dp[n][i];
if(n==0) sum=1;
printf("%d\n",sum);
}
return 0;
}