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; }
