http://acm.hdu.edu.cn/showproblem.php?pid=1203

(1)用到概率的一点常识,预处理:b[i]=1-b[i];

(2)注意n和m的个子含义,n为钱数, m为组数,不能错用(如初始化时将m当做n用。。)

(3)此题为简单的01背包问题。

具体代码:

View Code
#include<stdio.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n, m;
int a[11000];
float b[11000], dp[11000];
int main()
{
    int i, j;
    while(scanf("%d%d", &n, &m)!=EOF, n||m)
    {
        for(i=1;i<=m;i++)
            scanf("%d%f", &a[i], &b[i]), b[i]=1-b[i];
        for(i=0;i<=n;i++) dp[i]=1;
        for(i=1;i<=m;i++)
            for(j=n;j>=a[i];j--)
                dp[j]=min(dp[j], dp[j-a[i]]*b[i]);
        printf("%.1f%%\n", (1.0-dp[n])*100);
    }
    return 0;
}