浮点数无法作为数组下标进行遍历,改用个数进行遍历。
计算概率反用(1-p(n))的方法进行计算。
#include <iostream>
#include <string.h>
using namespace std;
const int MAX=0x7fffffff;
double dp[10005];
int main(){
int n;
while(cin>>n){
while(n--){
double v;
int m;
cin>>v>>m;
int vl[105];
double co[105];
int sum=0;
for(int i=0;i<m;i++){
cin>>vl[i]>>co[i];
sum+=vl[i];
}
for(int i=0;i<=sum;i++)dp[i]=0;
dp[0]=1;
for(int j=0;j<m;j++){
for(int i=sum-vl[j];i>=0;i--){
dp[i+vl[j]]=max(dp[i+vl[j]],dp[i]*(1-co[j]));
}
}
for(int i=sum;i>=0;i--){
if(dp[i]>(1-v)&&dp[i]!=0){
cout<<i<<endl;
break;
}
}
}
}
}