hdu 2955 动态规划 01背包

题意:Roy要偷银行,每个银行都有一个被抓到的概率,Roy的妈妈算出一个不被抓到的概率上限,要求求出Roy偷到最多的钱且不超过被抓到的概率上限。

正难则反, 状态转移方程则为  dp[ v ] = max( dp[ v - w[ i ] ] * p[ i ] , dp[ v ] ) , dp[ v ] 表示偷到  v  元逃脱的概率, w[ i ] 表示从第 i 个银行能偷到的钱, p[ i ] 表示偷第 i 个银行逃脱的概率。

#include <iostream>
using namespace std;

const int size = 105;
int w[size];
float dp[10005], p[size];

int main()
{
	int t, n, i, v, sum;
    float f_limit;
	
	scanf("%d", &t);
	while(t--)
	{
		sum = 0;
		scanf("%f %d", &f_limit, &n);
		
		for(i = 1; i <= n; i++)
		{
            scanf("%d %f", &w[i], &p[i]);
			p[i] = 1 - p[i];
		    sum += w[i];
		}

		memset(dp, 0, sizeof(dp));
		dp[0] = 1;
		for(i = 1; i <= n; i++)
			for(v = sum; v >= w[i]; v--)
				if(dp[v-w[i]]*p[i] > dp[v])
					dp[v] = dp[v-w[i]]*p[i];
		for(v = sum; v >= 0; v--)
			if(dp[v] > 1 - f_limit)
			{
				printf("%d\n", v);
				break;
			}
	}
	return 0;
}


 

你可能感兴趣的:(float)