Robberies 01背包变形 hdoj
Posted 青春的梦想付诸行动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Robberies 01背包变形 hdoj相关的知识,希望对你有一定的参考价值。
在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能讲物品i装入多次,也不能只装入物品的一部分。因此,该问题被称为0-1背包问题。
将小偷计划要偷的钱的总数作为背包的容量,然后每个银行的存款就作为各个物品的重量,
每个银行小偷的逃跑率就作为每个物品的价值,这样就转化为01背包问题了。
至于为什么不可以用题目给的被抓获的概率作为价值,是因为小偷被抓与否的计算方法,
不是将每个银行小偷被抓的概率相乘,概率论的基本知识,所以要以逃跑率作为价值。
定义数组 F[j]为偷到j万元的时候,逃跑的概率,那么状态方程如下:
F[j]=max{F[j],F[j-m[i]]*g[i]},其中m[i]是第i个银行的存款,g[i]是在该银行偷窃后逃跑的概率
这个状态方法和O1背包的状态方程是一个思想的。
#include<cstdio> #include<cstring> using namespace std; int main() { int t,n,mj[103],i,j,sum; //mj表示价钱 double p,rj[103],temp,dp[10010];//rj表示不被抓的概率 dp表示金钱为i时不被抓的概率 scanf("%d",&t); while(t--) { sum=0; memset(dp,0,sizeof(dp)); dp[0]=1; //没偷钱表示100%不被抓 scanf("%lf%d",&p,&n); for(i=0;i<n;i++) { scanf("%d%lf",&mj[i],&temp); rj[i]=1-temp; sum+=mj[i]; } for(i=0;i<n;i++) for(j=sum;j>=mj[i];j--) if(dp[j-mj[i]]*rj[i]>dp[j]) dp[j]=dp[j-mj[i]]*rj[i]; p=1-p; for(i=sum;i>=0;i--) if(dp[i]>=p) break; printf("%d\n",i); } return 0; }
以上是关于Robberies 01背包变形 hdoj的主要内容,如果未能解决你的问题,请参考以下文章