Communication System dp 동적 계획 | | 욕심

5221 단어 동적 기획poj
제목: 당신이 사교 시스템을 쓰려면 n개의 부품이 필요합니다. 당신은 n개의 개발 업체가 모든 개발 업체에 w개의 부품을 제공하여 당신에게 줄 수 있습니다. 당신은 모든 개발 업체에서 부품을 가져와서 광대역값과 가격을 가질 수 있습니다.
최종 성가비(B/P)가 가장 높음
B가 선택한 n개 부품 중minP가 n개 부품의 총계를 선택합니다
사고방식: b값이 일정한 상황에서 성가가 가장 높을 때 우리는 n개 부품의 최소치 dp[i]=mindp[i-1]+p, dp[i]를 선택하기만 하면 된다.
b가 정해지지 않을 때
b가 정해지지 않을 때 우리는 dp[i][j]를 설정하여 i개의 부품을 선택하여 j광대역의 최대치에 도달하도록 한다
k는 기타 광대역 값
dp【i】【j】 = min(dp【i-1】【j】,dp【i-1】【k】 +p);
예제:
1 3
3 100 25 150 35 80 25
2 120 80 155 40
2 100 100 120 110
150 35
155 40
120 110
120/185=0.649
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
using namespace std;
const int inf = 0xffffff;
int t;
int dp[105][1005];
int a[105];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);

        for(int i = 0 ; i <= n; i++)
            for(int j = 0 ; j <= 1005; j++)//      ps:                     f【0】]=0 f【1~n】   -~(  )           de f【n】   
                           dp[i][j] = inf;<pre name="code" class="cpp">/*                    */ 
int b,p;
//       
for(int i=1; i<=n; i++)
{
    scanf("%d",&a[i]);
    for(int j = 1; j <= a[i]; j++)
    {
        scanf("%d%d",&b,&p);
        if(i==1) dp[1][b] = min(dp[1][b],p);
        else
        {
            for(int k = 0; k < 1005; k++)
            {
                if(dp[i-1][k] != inf)
                {
                    if(k<=b)
                    {
                        dp[i][k] = min(dp[i][k],dp[i-1][k] + p);
                    }
                    else
                    {
                        dp[i][b] = min(dp[i][b],dp[i-1][k] + p);
                    }
                }
            }
        }
    }
}
double ans = 0.0;
for(int i = 0; i < 1005; i++)
{
    if(dp[n][i] != inf)
    {
        double ret = i*1.0 / dp[n][i];//  1.0 double   
        if(ret > ans) ans = ret;
    }
}
printf("%.3lf
",ans); } }
int b,p;//광대역과 가격 for(int i=1;i<=n;i++) {scanf('%d', &a[i]), for(int i=1; i<=1;i<=1;i<=n; i++), for(int j= 1; 1; 1; i=1; 1; 1; 1; int j= 1; j++ 1; j+++) {scan++) {s<<<<< i++) {+) {scan i=n = = i< i+) {i< i< i= i=1; i=1; i=1; i< i=1; i< i=1; i< i=1; i< i=1; i< i< i=1; i< i< k]=min(dp[i][k], dp[i-1][k]+p);else { dp[i][b] = min(dp[i][b],dp[i-1][k] + p); } } } } } } double ans = 0.0; for (int i = 0; i < 1005; i++) {if(dp[n][i]! = inf) {double ret = i*1.0/dp[n][i];//1.0 double 세부 사항 주의
 if(ret > ans) ans = ret; } } printf("%.3lf",ans); }}
 贪心解法 : 
  
 

思路就简单多了 每次选性价比最高的那个 

poj 友情提供

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

struct node
{
	int bandwidth, price, kind;
};

node divice[10001];
int num[101];

bool cmp( node a, node b )
{
	if ( a.bandwidth < b.bandwidth )
		return true;
	else if ( a.bandwidth == b.bandwidth )
	{
		if ( a.price < b.price )
			return true;
		else if ( a.price == b.price )
		{
			if ( a.kind < b.kind )
				return true;
			else
				return false;
		}
		else
			return false;
	}
	else
		return false;
}

int main()
{
	int testNumber;
	scanf("%d", &testNumber);
	for ( int testCount = 1 ; testCount<= testNumber ; testCount ++ )
	{
		int number;
		scanf("%d", &number);
		int count = 0;
		int maxWidth[101];
		for ( int i = 0 ; i < number ; i ++ )
			maxWidth[i] = 0;
		for ( int i = 0 ; i < number ; i ++ )
		{
			scanf("%d", &num[i]);
			for ( int j = 0 ; j < num[i] ; j ++ )
			{
				scanf("%d%d", &(divice[count].bandwidth), &(divice[count].price));
				divice[count].kind = i;
				if ( divice[count].bandwidth > maxWidth[i] )
					maxWidth[i] = divice[count].bandwidth;
				count ++;
			}
		}

		sort( divice, divice+count, cmp );

		int minMaxWidth = 9999999;
		for ( int i = 0 ; i < number ; i ++ )
		{
			if ( maxWidth[i] < minMaxWidth )
				minMaxWidth = maxWidth[i];
		}

		double maxResult = 0;
		for ( int i = 0 ; i < count - number + 1  ; i ++ )
		{
			int minPrice[101];
			for ( int j = 0 ; j < number ; j ++ )
			{
				minPrice[j] = 9999999;
			}
			int tempBandwidth = divice[i].bandwidth, tempPrice = divice[i].price, tempKind = divice[i].kind;
			for ( int j = i + 1 ; j < count ; j ++ )
			{
				if ( divice[j].kind != tempKind && divice[j].price < minPrice[divice[j].kind] )
					minPrice[divice[j].kind] = divice[j].price;
			}
			for ( int j = 0 ; j < number ; j ++ )
			{
				if ( j != tempKind )
					tempPrice += minPrice[j];
			}
			if ( maxResult < (double)tempBandwidth/tempPrice )
				maxResult = (double)tempBandwidth/tempPrice;
		}
		printf("%.3f
", maxResult); } }

좋은 웹페이지 즐겨찾기