换硬币;
解析:由于数据不大,只有50$,先统一单位,同乘以20;
将每一中金额都预处理出来
DP基础题;第一维代表金额数,第二位代表使用的货币的种类数;
转移方程为dp[ i ][ j ] += dp[ i ][ j - 1]; //使用了i种币种,一定能用 i- 1种币种的种类,因为多的都可以用币种1表示;
if( i >= num[ j ] ) //当当前金额大于某一币种时,然后再加上当前剩余的金额的组成数即刻;
dp[ i ] [j ] += dp[ i - num[ j ] ]][ j ] ;
// Dollars.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1005;
int num[ 15 ] ={ 1, 2, 4, 10, 20, 40, 100, 200, 400, 1000, 2000 };
int dp[ maxn ][ 15 ];
//int _tmain(int argc, _TCHAR* argv[])
int main()
{
float n;
for( int i = 0; i < maxn; i++ )
{
dp[ i ][ 0 ] = 1;
for( int j = 1; j <= 10; j++ )
{
dp[ i ][ j ] = dp[ i ][ j - 1 ];
if( i >= num[ j ] )
dp[ i ][ j ] += dp[ i - num[ j ] ][ j ];
}
}
while( cin >> n ){
if( n == 0.00 )
break;
int temp = n * 20;
printf("%5.2lf%12d\n", n, dp[ temp ][9]);
}
return 0;
}