64,649
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
//dp[i][j] = p, 从前i bank抢j money 不被抓的最大概率p
//dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost[i]]*(1-rp))
//前边i-1个银行不被抓的概率dp[i-1][j-cost[i]],第i个银行
//不被抓的概率1-rp,前i个银行不被抓的概率为两者相乘
double dp[11111]; //max p
double p[111]; //was caught
int cost[111];
double limitp; //limit p
int N; //N bank
int sum; //max money
void DP()
{
memset(dp,0,sizeof(dp));
int i, j;
dp[0] = 1.0; //抢劫0元,不被抓的概率是1
for ( i = 1; i <=N; ++i )
{
for ( j = sum; j >=cost[i]; --j )
{
dp[j] = max(dp[j], dp[j-cost[i]]*(1-p[i]));
}
}
for (j=sum; j >= 0; --j)
{
if (dp[j] > (1.0-limitp))
{
cout << j << endl;
return;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("2.txt","r",stdin);
#endif
int T,i;
cin >> T;
while (T--)
{
sum = 0;
cin >> limitp >> N;
for ( i = 1; i <= N; ++i )
{
cin >> cost[i] >> p[i];
sum += cost[i];
}
DP();
}
return 0;
}
#include <iostream>
using namespace std;
//dp[i][j] = p, 从前i bank抢j money 不被抓的最大概率p
//dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost[i]]*(1-rp))
//前边i-1个银行不被抓的概率dp[i-1][j-cost[i]],第i个银行
//不被抓的概率1-rp,前i个银行不被抓的概率为两者相乘
double dp[111][11111]; //max p
double p[111]; //was caught
int cost[111];
double limitp; //limit p
int N; //N bank
int sum; //max money
void DP()
{
memset(dp,0,sizeof(dp));
int i, j;
for (i=0; i <= N; ++i)
dp[i][0] = 1.0; //抢劫0元,不被抓的概率是1
for ( i = 1; i <=N; ++i )
{
for ( j = sum; j >=cost[i]; --j )
{
dp[i][j] = max(dp[i-1][j], dp[i-1][j-cost[i]]*(1-p[i]));
}
}
for (j=sum; j >= 0; --j)
{
for(i=1; i <= N; ++i)
{
if (dp[i][j] > (1.0-limitp))
{
cout << j << endl;
return;
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("2.txt","r",stdin);
#endif
int T,i;
cin >> T;
while (T--)
{
sum = 0;
cin >> limitp >> N;
for ( i = 1; i <= N; ++i )
{
cin >> cost[i] >> p[i];
sum += cost[i];
}
DP();
}
return 0;
}