标签:
http://acm.hdu.edu.cn/showproblem.php?pid=2955
这道题求不被抓时的最大金钱。金额是整数,概率是小数。因为数组小标不能是小数,所以我们可以以钱作为weight,概率作为value。
这说明解背包问题时cost和weight不是定死的,是可以相互转换的。
以银行的的总金额作为V,安全概率作为value,金额作为cost,安全概率=各家银行安全概率之积
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> using namespace std; #define MEM(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define debug printf("!/m") #define INF 8000 #define MAX(a,b) a>b?a:b #define blank pf("\n") #define LL long long #define ep 1e-6 double dp[INF]; double ci[INF];//容量 int wi[INF];//价值 int n,V,i,j,v,t,sum; double vi; void zeroOnePack(int cost,double weight) { for(v = sum;v>=cost;v--) { dp[v] =MAX(dp[v],dp[v-cost]*weight); } } void completePack(int cost,int weight) { for(v = cost;v<=V;v++) { dp[v] =MAX(dp[v],dp[v-cost]+weight); pf("tt%d %d %d\n",i,v,dp[v]); } } int main() { sf("%d",&t); while(t--) { sf("%lf%d",&vi,&n); MEM(dp,0); dp[0] = 1.0; MEM(ci,0); MEM(wi,0); vi = 1-vi; sum = 0; for(i = 1;i<=n;i++) { sf("%d",&wi[i]); sf("%lf",&ci[i]); ci[i] = 1-ci[i]; sum+=wi[i]; } for(i = 1;i<=n;i++) { zeroOnePack(wi[i],ci[i]); } for(i = sum;i>=0;i--) { if(dp[i]-vi>0.000000001) { pf("%d\n",i); break; } } } return 0; }
78MS
标签:
原文地址:http://www.cnblogs.com/qlky/p/5033648.html