题意:就是给你11钟面额的钱,然后给你一个大面额的,用小面额的代替大面额的方法有多少种。
只是这里出现了小数,首先我们肯定是想吧小数转化成整数,所有面额都*100;
然后完全背包解决掉,
实际后面还要注意一个精度的问题。
代码中注意细节
#include<bits/stdc++.h>
using namespace std;
int w[11]={5,10,20,50,100,200,500,1000,2000,5000,10000};//*100后所有面值的钱
long long dp[30000];
int main()
{
memset(dp,0,sizeof(dp));
dp[0]=1;//初始化
for(int i=0;i<11;i++)//完全背包求种数
{
for(int j=w[i];j<=30000;j++)
{
dp[j]+=dp[j-w[i]];
}
}
double n;
while(~scanf("%lf",&n))
{
double s=n*100;
int m=s+0.5;//就是这里要加0.5的问题,因为浮点型在计算机中存储是有误差的,会导致进位丢失。
if(n==0)
break;
printf("%6.2lf%17lld\n",n,dp[m]);
}
}