HDU 1203 I NEED A OFFER!(01背包基础题)

来源:互联网 发布:淘宝联盟app推广 编辑:程序博客网 时间:2024/06/05 14:07

题目链接: I NEED A OFFER!

中文题。

注意从反面考虑和边界。



AC代码:

#include<stdio.h>#include<string.h>#define Min(a,b) a<b?a:bint main(){int n,m,j;int i,a[10000];double b[10000];double dp[10000];while(scanf("%d %d",&n,&m)!=EOF,(n+m)){for(i=0;i<=n;i++)//概率相乘,dp初始化为1.0dp[i]=1.0;for(i=0;i<m;i++){scanf("%d %lf",&a[i],&b[i]);b[i]=1.0-b[i];//那不到offer的概率}for(i=0;i<m;i++){for(j=n;j>=a[i];j--){dp[j]=Min(dp[j],dp[j-a[i]]*b[i]);}}printf("%.1lf%%\n",(1.0-dp[n])*100);}return 0;}


反思:又是一道逆向思维的题目。学习DP的时候注意边界和状态方程的由来。


0 0
原创粉丝点击