Communication System dp 동적 계획 | | 욕심
최종 성가비(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); } }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
01 가방, 완전 가방, 다중 가방 dp(동적 기획 입문 dp)01 가방은 2진법으로 직접 표시할 수 있지만 데이터 양이 너무 많으면 시간을 초과하는 것이 폭력이다.01 가방의 사상은 바로 이 물품에 대해 내가 넣은 가치가 큰지 안 넣은 가치가 큰지 비교하여 방정식 f[i][v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.