HDU 1203 I NEED A OFFER! (01DP)

本文介绍了一种使用动态规划解决概率问题的方法,通过初始化dp数组来寻找最优解。具体实现中,采用双重循环来更新dp数组,以求得从1到n的所有整数达到目标状态的最小概率。

思路:这道题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;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值