HDU_1203_01揹包

揹包的典型思想,dp[i] i<=n 維持i時可以得到工作的最大概率,dp條件是:dp[j] = max(dp[j], 1-(1-dp[j-wei[i]])*(1-val[i]));

說來慚愧哭,概率論學的差,竟然沒有想到這個條件,看來A題時還需要淡定的思考。貼代碼以表決心,以後要好好A題了奮鬥奮鬥奮鬥

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

int wei[10011];
double dp[10011], val[10011];

int main()
{
    int m, n;

    while(~scanf("%d%d", &n, &m) && (n+m))
    {
        for(int i=1; i<=m; ++i)
        {
            scanf("%d%lf", &wei[i], &val[i]);
        }

        for(int i=0; i<=n; ++i)
            dp[i] = 0;

        for(int i=1; i<=m; ++i)
        {
            for(int j=n; j>=wei[i]; --j)
            {
                dp[j] = max(dp[j], 1-(1-dp[j-wei[i]])*(1-val[i]));
            }
        }

        dp[n] *= 100;

        printf("%.1f%%\n", dp[n]);
    }

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章