P4377 [USACO18OPEN] Talent Show G (codicioso + 01 mochila + 01 planificación)

Tema Descripción

¡El granjero John quiere llevar sus n vacas, numeradas 1...n por conveniencia, a la feria agrícola para participar en la exposición ganadera anual! El peso de su novena vaca es wi​ y el nivel de talento es ti​, los cuales son números enteros.

A su llegada, el granjero John se sintió intimidado por las nuevas reglas del Da Niu Show de este año:

(i) Un grupo de vacas que participan en una competencia debe tener un peso total de al menos W (esto es para garantizar que compita el equipo más fuerte, no solo una vaca más fuerte), y.

(2) Gana el grupo con la mayor proporción entre el valor total del talento y el peso total.

FJ nota que el peso total de todas sus vacas no es menor que W, por lo que puede enviar un equipo que cumpla con la regla (1). Ayúdelo a determinar la relación óptima entre talento y peso que se puede lograr en dicho equipo.

formato de entrada

La primera línea son dos números enteros, que representan el número n de ganado y el límite de peso total W.

Líneas 2 a (n+1), cada línea tiene dos números enteros, y el número entero en la línea (i+1) representa el peso wi​ y el nivel de talento t_iti​ de la vaca i.

formato de salida

Pídale al granjero que use un grupo de vacas cuyo peso total sea al menos W para obtener la relación entre el valor total máximo posible del talento y el peso total.

Si su respuesta es A, genere el valor de 1000A redondeado hacia abajo para que la salida sea un número entero (cuando el número en cuestión no es un número entero, la operación de redondeo elimina todos los decimales al redondear hacia abajo a una parte entera).

Muestras de entrada y salida

Escriba #1 para copiar

3 15 
20 21 
10 11 
30 31

salida #1 copia

1066

Ideas:

Hay 2 condiciones a considerar en esta pregunta:

1. Un grupo de vacas que participen en el concurso deberá tener un peso total de al menos W

2. El equipo con la mayor proporción entre el valor total del talento y el peso total gana.

La segunda condición pertenece a la cuestión de si elegir esta vaca o no, este es mi primer problema de planificación de puntuación 01.

Cuando la primera condición no es menor que W, se puede usar programación dinámica pero el resultado final es dp[W]

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f, N = 255, WW = 1005;
int n, W;
struct { int w, t; double y; }cow[N];
double dp[WW];
bool check(double x) {
	int i, j;
	for (int i = 1; i <= n; i++) cow[i].y = (double)cow[i].t - x * cow[i].w;//0/1规划的基础思路
	for (int i = 1; i <= W; i++) dp[i] = -INF;
	dp[0] = 0;
	// 0-1背包的思想 一维
	for (int i = 1; i <= n; i++) {
		for (int j = W; j >= 0; j--) { // 当前背包的大小
			if (j + cow[i].w >= W) dp[W] = max(dp[W], dp[j] + cow[i].y); //超过了这个了贪心是否选这个
			else dp[j + cow[i].w] = max(dp[j+ cow[i].w], dp[j] + cow[i].y);
		}
	}
	return dp[W] < 0; // true x大了 我们要使 x尽可能大
}
int main() {
	cin >> n >> W;
	for (int i = 1; i <= n; i++) cin >> cow[i].w >> cow[i].t;
	double L = 0, R = 0;
	for (int i = 1; i <= n; i++) R += cow[i].t;
	for (int i = 0; i < 50; ++i) {
		double mid = L + (R - L) / 2;
		if (check(mid)) R = mid;
		else L = mid;
	}
	cout << (int)(L * 1000) << endl;
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/128616811
Recomendado
Clasificación