您的位置:首页 > Web前端

HDU 1203 I NEED A OFFER!(01背包基础题)

2014-07-17 20:52 423 查看
题目链接: I NEED A OFFER!

中文题。

注意从反面考虑和边界。

AC代码:

#include<stdio.h>
#include<string.h>
#define Min(a,b) a<b?a:b
int main()
{
	int n,m,j;
	int i,a[10000];
	double b[10000];
	double dp[10000];

	while(scanf("%d %d",&n,&m)!=EOF,(n+m))
	{
		for(i=0;i<=n;i++)//概率相乘,dp初始化为1.0
			dp[i]=1.0;
		for(i=0;i<m;i++)
		{
			scanf("%d %lf",&a[i],&b[i]);
			b[i]=1.0-b[i];//那不到offer的概率
		}
		for(i=0;i<m;i++)
		{
			for(j=n;j>=a[i];j--)
			{
				dp[j]=Min(dp[j],dp[j-a[i]]*b[i]);
			}
		}
		printf("%.1lf%%\n",(1.0-dp
)*100);
	}
return 0;
}


反思:又是一道逆向思维的题目。学习DP的时候注意边界和状态方程的由来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: