1914: 找零钱
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 17 Solved: 6
[ Submit][ Status][ Web Board]
Description
我们知道人民币有1、2、5、10、20、50、100这几种面值。 现在给你 n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。 比如4元,能用4张1元、2张1元和1张2元、2张 2元,三种表示方法。
Input
输入有多组,每组一行,为一个整合n。 输入以0结束。
Output
输出该面额有几种表示方法。
Sample Input
1
4
0
Sample Output
1
3
HINT
Source
AC CODE:
#include <iostream>
using namespace std;
int COUNT;
int cost[]={1,2,5,10,20,50,100};
int main()
{
int n;
int i;
int s[251][102][8]={0}; // s[a][b][c] a>=b a当前总值 b当前使用张数 c 最高使用某一类时的方案数
for(i=0;i<7;i++)
{
s[ cost[i] ][1][i]=1;
}
s[1][101][0]=1;
for(i=2;i<251;i++) // s[2][1][1]=1; s[2][2][0]=1;
{
for(int j=1;j<=i&&j<101;j++)
{
for(int k=6;k>=0;k--)
{
if(i>cost[k])
{
for(int l=k;l>=0;l--)
{
s[i][j][k]+=s[ i-cost[k] ][j-1][l];
}
}
s[i][j][7]+=s[i][j][k];
}
s[i][101][0]+=s[i][j][7];
}
}
while(cin>>n&&n!=0)
{
cout<<s[n][101][0]<<endl;
}
return 0;
}
暴力AC解法:
#include<stdio.h>
int s[251];
int main()
{
int a,b,c,d,e,f,g,sum;
for(a=0; a<=2; a++)
for(b=0; b<=5; b++)
for(c=0; c<=12; c++)
for(d=0; d<=25; d++)
for(e=0; e<=50; e++)
for(f=0; f<=120; f++)
for(g=0; g<=250; g++)
{
sum=a*100+b*50+c*20+d*10+e*5+f*2+g;
if (sum>250||a+b+c+d+e+f+g>100) break;
s[sum]++;
}
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
printf("%d\n",s[n]);
}
return 0;
}