查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!
http://acm.hdu.edu.cn/showproblem.php?pid=2955
目题粗心:劫匪抢银行,要求被抓概率小于P。共有n个银行,第i个银行钱数为m[i],被抓概率为p[i](float型);求劫匪最多能抢多少钱;
思绪:由于值价(被抓概率)是浮点型且不能直接相加,所以不能以值价为背包。这个目题可以以取得的值价(即抢到的钱数)为背包,求抢到一定钱时逃跑的概率;虽然抢到的钱数不是连续化变的,但是通过初始化时的妙巧理处还是可以连续历遍的,体具见代码及注释;
#include<stdio.h> #include<string.h> #define ans(a,b) ((a)>(b)?(a):(b)) #define N 111 int m[N]; float p[N],f[11111]; int main() { int T,n,i,j,sum,ans; float P; scanf("%d",&T); while(T--){ sum=0,ans=0; scanf("%f%d",&P,&n); for(i=0;i<n;i++){ scanf("%d%f",&m[i],&p[i]); sum+=m[i]; } memset(f,0,sizeof(f));//初始化,特别意注f[0]; f[0]=1; //盘算抢j钱金时逃跑的概率 for(i=0;i<n;i++){ for(j=sum;j>=m[i];j--){//意注j的上限 f[j]=ans(f[j],f[j-m[i]]*(1-p[i])); } } for(j=0;j<=sum;j++){//对于j取不到的值恒有f[j]=0,why?想一想初始化 if(P>(1-f[j])&&j>ans) ans=j; } printf("%d\n",ans); } return 0; }
文章结束给大家分享下程序员的一些笑话语录: 现在社会太数字化了,所以最好是有一个集很多功能于一身的设备!