又是一道背包题,模式完全一样的,就是稍微注意下格式,然后memset不能对double型的进行初始化。就是练练手。
但是1A还是挺开心的。。。。double注意精度处理问题。
#include <stdio.h>
#include <string.h>
#define maxn 10010
#define eps 1e-12
#define inf 0x3f3f3f3f
double dp[maxn],pro[maxn];
int cost[maxn],n,m;
int sig(double x)
{
return (x>eps)-(x<-eps);
}
double min(double x,double y)
{
if(sig(x-y)>0) return y;
else return x;
}
void init()
{
for(int i=0;i<=m;i++) dp[i]=1.0000;
}
int main()
{
// int n,m;
while(1)
{
scanf("%d%d",&m,&n);
if(n+m==0) break;
// memset(dp,1.0,sizeof(dp));
init();
int i,j,k;
for(i=1;i<=n;i++) scanf("%d%lf",&cost[i],&pro[i]);
// for(i=1;i<=n;i++) printf("**%lf",1-pro[i]);printf("\n");
for(i=1;i<=n;i++)
{
for(j=m;j>=cost[i];j--)
{
// printf("**%lf",dp[j-cost[i]]*(1-pro[i]));
dp[j]=min(dp[j],dp[j-cost[i]]*(1-pro[i]));
}
// printf("\n");
}
printf("%.1lf%%\n",(1-dp[m])*100);
}
return 0;
}