HDOJ1203

DP的是没有被录取的概率,当这个概率最低的时候也就是录取率最高的时候。


#include"iostream"
#include"algorithm"
using namespace std;
const int maxn=10000+10;
const int maxm=10000+10;
double f[maxn];
int volume[maxn];
double N[maxn];
int main()
{
    /*freopen("a.txt","r",stdin);*/
    int v,n;
    while(scanf("%d%d",&v,&n)!=EOF,(v||n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d%lf",&volume[i],&N[i]);
            N[i]=1-N[i];
            /*cout<<N[i]<<endl;*/
        }
        f[0]=1;
        for(int i=1;i<=v;i++)
            f[i]=1;
        for(int i=1;i<=n;i++)
            for(int j=v;j>=volume[i];j--)
            {
                f[j]=min(f[j],f[j-volume[i]]*N[i]);
                /*cout<<f[j]<<endl;*/
            }
        printf("%.1f%%\n",100*(1-f[v]));

    }
    return 0;
}




<pre name="code" class="cpp">#include"iostream"
#include"stdio.h"
const int num=10005;
const int mum=10005;
using namespace std;
int main()
{
	//freopen("a.txt","r",stdin);
	int n,m;			//钱,几所学校   体积,几个物品
	int c[num];			 //记录物品体积	(学校学费)
	double w[num];			  //记录物品价值(概率)
	double f[mum];   //记录当前费用下最高的概率
	while(cin>>n>>m&&(n||m))	  //体积  物品数量   //m,n 两个不能同时为0
	{
		int i,j;
		for(i=0;i<m;i++)
			cin>>c[i]>>w[i];  //输入体积 价值
		for(i=0;i<=n;i++)
			f[i]=1;
		for(i=0;i<m;i++)
		{
			for(j=n;j>=c[i];j--)
				if(f[j-c[i]]*(1-w[i])<f[j])
				   	f[j]=f[j-c[i]]*(1-w[i]);
		}
		printf("%.1f%%\n",(1-f[n])*100);
	}
	return 0;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值