传送门http://acm.hdu.edu.cn/showproblem.php?pid=1203
#include<iostream>
#include<cstdio>
#define maxn 10010
using namespace std;
double dp[maxn];
double w;
int v;
//计算1-最小录取失败数值==最大录取值
int main()
{
int n,m;
while(cin>>n>>m)
{
if(!n&&!m)
break;
for(int i=0;i<=n;i++) dp[i]=1;//从0开始 dp[i]代表 当放的空间恰好为i时的最小录取失败值
for(int i=1;i<=m;i++)//遍历m个学校
{
scanf("%d %lf",&v,&w);
for(int j=n;j>=0;j--)//滚动数组 之所以从后往前遍历 因为从前往后遍历的话
//会首先影响dp[j-v]的数值 则不能推出剩下的dp了
{
if(j-v>=0)//如果没这个限制条件可能RE
dp[j]=min(dp[j],dp[j-v]*(1-w));//相当于不用滚动数组的min{dp[i-1][j],dp[i][j-v]*w};
}
}
double ans=(1-dp[n])*100;
printf("%.1lf%%\n",ans);
}
}
hdu 1203 01背包 滚动数组
最新推荐文章于 2018-05-16 20:29:39 发布