我有一题,解出必有解决方案

题目描述
一个劫匪要去抢劫n家银行,每家银行有一定的现金,每抢一家银行该劫匪有一定几率被警察抓住,但是当该劫匪连续作案被抓住的几率小于p时他就可以逃脱,问该劫匪在不被捕的情况下最多能抢到多少钱?

输入格式
第一行为用例组数T,每组用例第一行为一个浮点数P和一个整数n分别表示被捕的几率上限以及该劫匪计划抢劫的银行数量,之后n行每行一个整数M和一个浮点数p表示该家银行的现金数以及该劫匪抢劫该家银行被捕的几率。
0<T≤100
0.0≤P≤1.0
0<n≤100
0≤M j ≤100
0.0≤p j ≤1.0

输出格式
对于每组用例,输出该劫匪在不被捕的情况最多能抢到多少钱

样例
Input 1
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
Output 1
2
4
6
我的代码

#include <bits/stdc++.h>
using namespace std;
int t,m,C[10050];
double g[10005],dp[10005],p;
int main() {
	int t,n;
	cin>>t;
	while(t--) {
		cin>>p>>n;
		int sum =0;
		for(int i=1; i<=n; i++) {
			cin >>C[i]>>g[i];
			g[i]=1 -g[i];
			sum +=C[i];
		}
		for(int i =1; i<=n; i++) {
			for(int j=sum; j>=C[i]; j--) {
				dp[j]=max(dp[j],dp[j-C[i]]*g[i]);
			}
		}
		int f =0;
		for(int i =sum; i >=0; i--) {
			if(dp[i]>p) {
				cout <<i<<endl;
				f=1;
				break;
			}
		}
		if(f==0) {
			cout<<0<<endl;
		}
	}
	return 0;
}

几分?社么问题?

3 个赞

你又没AC

要辅导吗?

1 个赞

实力!!

1 个赞
#include <bits/stdc++.h>
using namespace std;
int t,m,C[10050];
double g[10005],dp[10005],p;
int main() {
	int t,n;
	cin>>t;
	while(t--) {
		memset(dp,0,sizeof(dp));
		memset(g,0,sizeof(g));
		memset(C,0,sizeof(C));
		cin>>p>>n;
		int sum =0;
		for(int i=1; i<=n; i++) {
			cin >>C[i]>>g[i];
			g[i]=1.00-g[i];
			sum +=C[i];
		}
		dp[0]=1;
		for(int i =1; i<=n; i++) {
			for(int j=sum; j>=C[i]; j--) {
				dp[j]=max(dp[j],dp[j-C[i]]*g[i]);
			}
		}
		bool f =0;
		for(int i =sum; i >=0; i--) {
			if(dp[i]>p) {
				cout <<i<<endl;
				f=1;
				break;
			}
		}
		if(f==0) {
			cout<<0<<endl;
		}
	}
	return 0;
}

我代码,你有实力你给我改AC @linan04113

私信

1 个赞

你这是订正得分

:rofl: :rofl: :rofl: