这个题,一开始做的时候,我竟然天真的按着案例相加,竟然全对上了,于是就上了贼船,用possible作为了容器。
但后来看了一些资料以后,发现应该用总的value作为容器,求得是价值,以价值为消耗来做。不可以用possible的原因是,初始化的时候都为0,显然是不合理的。
最后还被一个地方卡了半天,那就是可能一分钱都没偷到,百分之百不被抓~。 ~
#include <iostream>
#include <iomanip>
#include<queue>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<iomanip>
#include<string.h>
#include<sstream>
#include<string>
#include<queue>
#define MAX 5842
//¶¨Ò庯Êý¶Î
#define repf(i,a,b) for(int i =(a);i<(b);i++)
#define repfe(i,a,b) for(int i =(a);i<=(b);i++)
using namespace std;
struct bank{
public :
double possible;
int value ;
};
bank banks[150];
double dp[15000];
int main() {
int num ,num_banks,sum_money;
double p;
cin >> num ;
while (num --)
{
cin >>p>>num_banks;
sum_money = 0 ;
repfe(i,1,num_banks)
{
// scanf("%d%lf",&banks[i].value,&banks[i].possible);
cin>> banks[i].value>>banks[i].possible ;
sum_money+=banks[i].value;
}
memset(dp,0,sizeof(dp));
dp[0]=1.0;
repfe(i,1,num_banks)
{
for(int j = sum_money ; j >=banks[i].value;j --)
{
dp[j] = max(dp[j],dp[j-banks[i].value]*(1.0-banks[i].possible));
}
}
for(int i = sum_money;i>=0;i--)
{
if(1-dp[i]<p)
{
printf("%d\n",i);
break ;
}
}
}
return 0 ;
}