题意:“至少一份offer的最大概率”。即求拿不到offer的最小概率
(得到offer的最大概率 = 1 - 反例的最小概率)。
状态转移方程:dp[j]= Min(dp[j],dp[j-a[i]]*(1-b[i]))。
注意:0 0 表示输入语句结束。
写这题之前建议大家先了解
1)动态规划:
2)背包种类:背包算法了解:
这几个超链接仅仅要在百度搜索 “背包思想” 就能够全部出来了。
重要内容剪切例如以下:
中本阶段的状态往往是上一阶段状态和上一阶段决策的结果。
则其便是:
f[i][v]=max{ f[i-1][v], f[i-1][v-w[i]]+v[i] }。
能够压缩空间,f[v]=max{f[v],f[v-w[i]]+v[i]}
这个方程非常重要,基本上全部跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详解一下:“将前i件物品放入容量为v的背包中”这个子问题。若仅仅考虑第i件物品的策略(放或不放),那么就能够转化为一个仅仅牵扯前i-1件物品的问题。
假设不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”。价值为f[i-1][v];假设放第i件物品。那么问题就转化为“前i-1件物品放入剩下的容量为v-w[i]的背包中”,此时能获得的最大价值就是f [i-1][v-w[i]]再加上通过放入第i件物品获得的价值v[i]。
// 本人看完这些超链接后就明确了。以后写背包题就是机械化写题了,,哈哈哈!
代码例如以下:
#include#include using namespace std;#define SIZE 11111double dp[SIZE];double Min(double x,double y){ return x >n>>m,n+m){ // 输入每一件物品的重量和价值 for(i=0;i =a[i];j--){ // 动态转移方程,j物品的价值 = Min(放入物品j,不放入物品j) dp[j]=Min(dp[j],(dp[j-a[i]])*(1-b[i])); } } // 求出答案 printf("%.1lf%%\n",(1-dp[n])*100); } return 0;}
I NEED A OFFER!
他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每一个学校都有不同的申请费用a(万美元),而且Speakless预计了他得到这个学校offer的可能性b。不同学校之间是否得到offer不会互相影响。“I NEED A OFFER”,他大叫一声。
帮帮这个可怜的人吧,帮助他计算一下。他能够收到至少一份offer的最大概率。(假设Speakless选择了多个学校,得到随意一个学校的offer都能够)。