思路:这道题01是很明显的但是在初始化的时候,愣了,想和上一道DP题一样找到一个dp[]值来初始化为0,其余为inf但是,并找不到这么一个数。可以看出1-n最大的概率都为1,那么既然是求最小值,那么可以初始化为最大。
现在有两种初始化方式:1.求最小直接初始化成最大2.求最小以某个dp[]值初始化为0(或据情况的最小值)其余初始化最大。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#define L1 long long
#define L2 int
#define inf 0x3f3f3f3f
using namespace std;
const int m1=1001000;
const int m2=1010;
int w[10001];
double ge[10001];
double dp[10006];
int main()
{
int n,i,j,k,cla,p,m;
while(~scanf("%d%d",&n,&m)){
if(!n&&!m) break;
for(i=1;i<=m;i++){
scanf("%d %lf",&w[i],&ge[i]);
ge[i]=1-ge[i];
}
for(i=0;i<=n;i++)
dp[i]=1;
for(i=1;i<=m;i++){
for(j=n;j>=w[i];j--){
dp[j]=min(dp[j],dp[j-w[i]]*ge[i]);
}
}
printf("%.1lf%%\n",(1-dp[n])*100);
}
return 0;
}
本文介绍了一种使用动态规划解决概率问题的方法,通过初始化dp数组来寻找最优解。具体实现中,采用双重循环来更新dp数组,以求得从1到n的所有整数达到目标状态的最小概率。
3万+

被折叠的 条评论
为什么被折叠?



