01背包 基础
For a few months now, Roy has been assessing the security of various banks and the amount of cash they hold. He wants to make a calculated risk, and grab as much money as possible.
His mother, Ola, has decided upon a tolerable probability of getting caught. She feels that he is safe enough if the banks he robs together give a probability less than this.
InputThe first line of input gives T, the number of cases. For each scenario, the first line of input gives a floating point number P, the probability Roy needs to be below, and an integer N, the number of banks he has plans for. Then follow N lines, where line j gives an integer Mj and a floating point number Pj .
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .OutputFor each test case, output a line with the maximum number of millions he can expect to get while the probability of getting caught is less than the limit set.
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.Sample Input
3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05
Sample Output
2 4 6
- 题意:其实这道题还是很坑的,就是有个人去抢银行了,每个银行可以抢的钱是Mj,抢钱被抓住的概率是Pj,给你一个最大被抓概率,问这时最多抢多少钱。
- 思路:这道题的关键在于一般情况下,我们用背包容量来表示dp的数位,这个题目中背包大小变成了浮点数,就只能反过来存,dp[获得钱数]=概率;最后从大到小输出第一个概率大于等于Pj的dp的标点
代码:
import java.util.Arrays; import java.util.Scanner; public class E { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); while(t-->0){ double v = sc.nextDouble(); int n = sc.nextInt(); double vo[] = new double[1050]; int val[] = new int[1050]; int sum = 0; for(int i=0;i<n;i++){ val[i] = sc.nextInt(); vo[i] = sc.nextDouble(); sum+=val[i]; } double[] dp = new double[10500]; Arrays.fill(dp, 0); dp [0] = 1; for(int i=0;i<n;i++){ for(int j=sum;j>=val[i];j--){ dp[j] = Math.max(dp[j], dp[j-val[i]]*(1-vo[i])); // System.out.println(j+" :"+dp[j]); } } for(int i=sum;i>=0;i--){ if(dp[i]>=(1-v)){ System.out.println(i); break; } } } } }