poj 1018 求B/P最大值

转载 2012年07月26日 01:03:12

动态规划方法参照:http://hi.baidu.com/guzhou_diaoke/item/b7d0840e1461919ba3df431f

题目大意:有n件商品,每件商品有m个制造商,每个制造商制造的商品有不同的 带宽和价格,每件商品必须选一个制造商,最后的带宽是所有带宽中的最小值,价值是所有商品的总价格,目的是使B/P最大,输出最大的B/P的值。

解题思路:动态规划

dp[i][j]表示选了前i件商品,最小带宽为j时的价值总和。

那么求B/P最大,则要使P尽量的小

那么tb = min(j, b[k])

dp[i][tb] = min(dp[i][tb], dp[i-1][j] + p[k]);

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int maxn = 101;
const int maxm = 1010;

int dp[maxn][maxm];
int t, n;
int m, b[maxn], p[maxn];

int main()
{
	
	scanf("%d", &t);
	while(t-- != 0)
	{
		memset(dp, -1, sizeof(dp));
		scanf("%d", &m);
		int maxb = 0;
		for(int i = 1; i <= m; i++)
		{
			scanf("%d", &n);
			for(int k = 1; k <= n; k++)
			{
				scanf("%d %d", &b[k], &p[k]);
				maxb = max(maxb, b[k]);
			}
			
			if(1 == i)
			{
				for(int k = 1; k <= n; k++)
					dp[1][b[k]] = p[k];
				continue;
			}
			
			for(int j = 0; j <= maxb; j++)
			{
				if(dp[i-1][j] != -1)
				{
					for(int k = 1; k <= n; k++)
					{
						int tb = min(j, b[k]);
						if(dp[i][tb] == -1)
							dp[i][tb] = dp[i - 1][j] + p[k];
						else
							dp[i][tb] = min(dp[i][tb], dp[i - 1][j] + p[k]);
					}
				}
			}
		}
		double ans = 0;
		for(int k = 0; k <= maxb; k++)
		{
			if(dp[m][k] != -1)
				ans = max(ans, 1.0 * k / dp[m][k]);
		}
		printf("%.3f\n", ans);
	}
	
	return 0;
}


poj 3111 K Best ,二分,牛顿迭代

poj 3111  K Best 有n个物品的重量和价值分别是wi和vi。从中选出k个物品使得单位重量的价值最大。 题解: 1、二分做法 2、牛顿迭代 效率比较: 二分做法: 转换成判断...
  • yew1eb
  • yew1eb
  • 2014年08月21日 16:12
  • 2101

求解x=a^b(mod m)的几种方法

求解x=a^b(mod m) Posted on 2012 年 11 月 6 日 by NARUTOACM — 14 Comments ↓ 本文致力于解决如下问题:求解x≡ab(mod m),其中a...
  • u010793761
  • u010793761
  • 2015年03月29日 15:27
  • 2842

最大堆 最小堆 poj2442 STL堆的使用

最大堆最小堆代码实现 http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621 最大堆 最小堆原理图 http://www.cnbl...
  • hnust_xiehonghao
  • hnust_xiehonghao
  • 2013年06月25日 20:28
  • 4836

poj 2263 Heavy Cargo 求a到b路上最小值中的最大值

Description Big Johnsson Trucks Inc. is a company specialized in manufacturing big trucks. Their la...
  • kongming_acm
  • kongming_acm
  • 2011年08月15日 21:55
  • 302

第十六周oj刷题——Problem C: B 求类中数据成员的最大值-类模板

Description 声明一个类模板,类模板中有三个相同类型的数据成员,有一函数来获取这三个数据成员的最大值。 Input 分别输入3个整数,3个浮点数,3个字符 Output  3个整数...
  • nufangdongde
  • nufangdongde
  • 2015年06月26日 18:07
  • 419

嘻唰唰第六批Problem G: B 求类中数据成员的最大值-类模板

Description 声明一个类模板,类模板中有三个相同类型的数据成员,有一函数来获取这三个数据成员的最大值。 类模板声明如下: template class Max { publi...
  • haojy826
  • haojy826
  • 2015年07月21日 18:46
  • 240

OJ第六批——Problem G: B 求类中数据成员的最大值-类模板

问题及代码:   Problem G: B 求类中数据成员的最大值-类模板 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 371  S...
  • Timor7hao
  • Timor7hao
  • 2015年07月21日 18:41
  • 422

poj 2479 求两段子数组和相加的最大值

题目大意:给出一组数字序列,要你求出两段子数组和两者相加的最大值 解题思路:求出1~i的序列的子数组和的最大值,i~n的序列的子数组和的最大值 然后枚举k, 1 关于求数组连续的子数组最大和,《...
  • xiaoxiaoluo
  • xiaoxiaoluo
  • 2012年06月18日 01:56
  • 1309

POJ3273 Monthly Expense(正确的二分法求最小化最大值)

Link:http://poj.org/problem?id=3273 Monthly Expense Time Limit: 2000MS   Memory ...
  • Enjoying_Science
  • Enjoying_Science
  • 2017年11月21日 16:14
  • 78

poj 1064 cable master (分绳子)二分求最大值

取r 然后这个题主要的问题是避免四舍五入的。像我们一般printf(”%.2f”,b)什么都四舍五入过了的。然后避免四舍五入可以用floor函数#include #include #includ...
  • bllsll
  • bllsll
  • 2017年04月20日 11:45
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1018 求B/P最大值
举报原因:
原因补充:

(最多只允许输入30个字)