动态规划百题 第11题 POJ - 1018

Communication System

 POJ - 1018 

NUPT要建立一套系统,该系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:参数和 价格。 
现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得F/P最大。其中F为这n件设备的参数的最小值,P为这n件设备的总价。我们的目标是为每个设备选择一个制造商来最大化F / P。

Input

输入文件的第一行包含一个整数t(1≤t≤10)表示t组测试样例。每个测试样例包含单个整数n(1≤n≤100)表示系统中的设备数,后面以下的n行包含:第i行(1≤i≤n)第一个数为制造商的设备数量mi(1≤mi≤100),之后是mi对正整数,分别表示制造商对应的参数和价格。

Output

每个测试样例只包含一个数,为F / P的最大值并保留3位有效小数。

Sample Input

1 3
3 100 25 150 35 80 25
2 120 80 155 40
2 100 100 120 110

Sample Output

0.649

题解:定义dp[i][j]为前i个物件的最小带宽为j的最小价格和

然后如果j<=p,说明当前带宽小于上一个状态的带宽,dp[i][j]=min(dp[i][j],dp[i-1][j]+q)

如果j>p,说明当前带宽大于上一个状态的带宽,dp[i][p]=min(dp[i-1][j]+q,dp[i][p])

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=100+5;
int dp[maxn][maxn*maxn];
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		for(int i=0;i<=n;i++){
			for(int j=0;j<=1100;j++){
				dp[i][j]=INF;
			}
		}
		for(int i=1;i<=n;i++){
			int m;
			scanf("%d",&m);
			for(int k=0;k<m;k++){
				int p,q;
				scanf("%d%d",&p,&q);
				if(i==1){
					dp[i][p]=min(dp[i][p],q);
				}else {
					for(int j=0;j<=1100;j++){
						if(dp[i-1][j]!=INF){
							if(j<=p)dp[i][j]=min(dp[i-1][j]+q,dp[i][j]);
							else dp[i][p]=min(dp[i][p],dp[i-1][j]+q);
						}
					}
				}
			}
		}
		double ans=0;
		for(int i=0;i<=1100;i++){
			if(dp[n][i]!=INF){
				//cout<<i<<endl;
				//cout<<dp[n][i]<<endl;
				ans=max(i*1.0/dp[n][i],ans);
			}
		}
		printf("%.3f\n",ans);
	}
	return 0;
}

 

全部评论

相关推荐

好羡慕走AI技术方向的人,实习薪资这么高😱&nbsp;人比人气死人😭
勇敢的嘟教授在考古:芯片公司挣得多多的,钱给的还不如互联网
点赞 评论 收藏
分享
自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务