YTU ---1914- 找零钱(DP)

1914: 找零钱

Time Limit: 1 Sec   Memory Limit: 64 MB
Submit: 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;
}







你可能感兴趣的:(C++,dp)