1. 程式人生 > >hdu-2955(01背包+逆向思維+審題)

hdu-2955(01背包+逆向思維+審題)

memset i++ return .cn stream ems tdi pac php

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2955

思路:註意p和m[i]是被抓的概率,不能直接用,要轉換為逃跑的概率,然後將得到的錢視為背包體積再求解。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
double p,vol[120],dp[12000]; 
int n,t,cost[120];
int main(void)
{
    int i,j,sum;
    cin>>t;
    while
(t--) { memset(dp,0,sizeof(dp)); sum=0; dp[0]=1; cin>>p>>n; p=1.0-p; for(i=0;i<n;i++) cin>>cost[i]>>vol[i],sum+=cost[i],vol[i]=1.0-vol[i]; for(i=0;i<n;i++) { for(j=sum;j>=cost[i];j--) dp[j]
=max(dp[j],dp[j-cost[i]]*vol[i]); } for(i=sum;i>=0;i--) { if(dp[i]>=p) break; } cout<<i<<endl; } return 0; }

hdu-2955(01背包+逆向思維+審題)