1023

1.题目编号:
1023

2.简单题意:
01背包变型。求最小概率

3.解题思路形成过程:
按01背包直接套公式,略有问题

4.感想
给浮点数赋值统一赋值不能用memset,而要用fill(开始地址,结束地址,值)

for(int j=n;j>=a[i];j--)

确实这行要递减,而且j递减到a[i]符合实际,但是为什么不能递减到1?有待思考

5.ac代码

#include <stdio.h>
#include <iostream>
#define Min(a,b) (a)>(b)?(b):(a)
using namespace std;


int main()
{
// freopen("1","r",stdin);
    const int SIZE=10010;
    int a[SIZE];
    double dp[SIZE],b[SIZE];
    int n,m;//n=volume,m=value
    while(cin>>n>>m,n||m)
    {
        fill(dp,dp+SIZE,1);
        for(int i=1;i<=m;i++)
        {
            cin>>a[i]>>b[i];
        }

        for(int i=1;i<=m;i++)
            for(int j=n;j>=a[i];j--)
            {
                dp[j]=Min(dp[j],dp[j-a[i]]*(1-b[i]));
            }

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

参考资料:http://www.cnblogs.com/Su-Blog/archive/2012/08/17/2644736.html

你可能感兴趣的:(1023)