11 26
4 13
题意:给你个硬币用1 5 10 25 50来兑换,兑换的总数量不能超出100;求有多少兑换方法。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=300;
int c1[N][110],c2[N][110];
int res[N],money[6]={0,1,5,10,25,50};
void Init()
{
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
c1[0][0]=1;
for(int i=1;i<=5;i++)//提供1 5 10 25 50
{
for(int j=0;j<=250;j++)//硬币最多达到250
for(int k=0;j+k*money[i]<=250;k++)//提供下一个物品数量。
for(int p=0;k+p<=100;p++) //限制硬币总数不超过100
c2[j+k*money[i]][p+k]+=c1[j][p];//dp[i][j]代表价值为i兑换个数为j的兑换方式的个数。
for(int j=0;j<=250;j++)
for(int p=0;p<=100;p++)
{ //限制硬币总数不超过100
c1[j][p]=c2[j][p];
c2[j][p]=0;
}
}
for(int i=1;i<=250;i++)
for(int j=0;j<=100;j++)
res[i]+=c1[i][j];
res[0]=1; //别忘了这个
}
int main(){
//freopen("input.txt","r",stdin);
int n;
Init();
while(~scanf("%d",&n))
{
printf("%d\n",res[n]);
}
return 0;
}