UVA 147 dollars (背包方案数 )(浮点数问题)

来源:互联网 发布:皇冠淘宝店铺转让价格 编辑:程序博客网 时间:2024/06/05 14:18

求背包问题的方案数, 把两位小数 *100 转化成为 了背包问题,  就在这个*100的过程中出现了问题,

double p=2.05;    int k=(int )( p*100)  ;   输出K  结果却是 204 

#define eps 0.0000001 

int k=(int) (( p+eps)*100)  这时候结果就正确了。  精度是一个值得注意的问题。。


#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define PI acos(-1.0)#define max(a,b) (a)>(b)? (a):(b)#define min(a,b) (a)>(b)? (b):(a)#define INT_MIN -0x7FFFFFFF#define INT_MAX 0x7FFFFFFFint mon[20]={5,10,20,50,100,200,500,1000,2000,5000,10000};long long  dp[30005];double p;int v;int main(){    int i,j,k;    while(scanf("%lf",&p),p>0)    {        v=(int )((p+0.000001)*100);//notice this ~~!        memset(dp,0,sizeof(dp));        dp[0]=1;        for(i=0;i<=10;i++)        {            for(j=mon[i];j<=v;j++)            {                dp[j]+=dp[j-mon[i]];            }        }        printf("%6.2lf%17lld\n",p,dp[v]);    }    return 0;}