특정 제품에 특정 부품을 만드는 제조사가 있다고 가정해 보겠습니다. 제조업체는 세 가지 표준에 대한 특정 등급을 갖는 n개의 다양한 부품 변형을 보유하고 있습니다. n개 제품의 등급은 '등급' 배열에 제공됩니다. 여기서 각 요소는 (A, B, C) 형식입니다. 여기서 A, B 및 C는 제품에 대한 서로 다른 등급 기준입니다. 이제 OEM은 부품 제조업체로부터 각 제품에 필요한 m개 부품을 구매하려고 합니다. OEM에서는 다음 조건을 충족하는 부품을 선택합니다.
동일한 부품을 2개 이상 구매할 수 없습니다.
V 값을 최대화하는 부품 세트를 선택하세요. 여기서 V = |표준 A의 총 등급| + |표준 B의 총 등급| + |표준 C의 총 등급|
OEM이 선택한 부품에서 V의 최대값을 찾아야 합니다.
그래서 입력이 n = 6, m = 4이면 평점 = {{2, 3, 5}, {3, 5, 2}, {4, 8, 5}, {1, 5, 3} , {7, 2, 7}, {4, 3, 6}}이면 출력은 56이 됩니다.
OEM이 부품 1, 3, 5, 6을 선택한 경우 각 범주의 총 평가는 다음과 같습니다.
Category A = 2 + 4 + 7 + 4 = 17 Category B = 3 + 8 + 2 + 3 = 16. Category C = 5 + 5 + 7 + 6 = 23 The total value of V is 17 + 16 + 23 = 56.
이 문제를 해결하기 위해 다음 단계를 따릅니다.
N := 100 Define an array arr of size: 9 x N. Define an array ans. for initialize i := 0, when i < n, update (increase i by 1), do: a := first value of ratings[i] b := second value of ratings[i] c := third value of ratings[i] arr[1, i] := a + b + c arr[2, i] := a - b - c arr[3, i] := a + b - c arr[4, i] := a - b + c arr[5, i] := -a + b + c arr[6, i] := -a - b - c arr[7, i] := -a + b - c arr[8, i] := -a - b + c for initialize i := 1, when i <= 8, update (increase i by 1), do: sort the array arr[i] for initialize i := 1, when i <= 8, update (increase i by 1), do: reverse the array arr[i] if m is the same as 0, then: V := 0 Otherwise for initialize j := 1, when j <= 8, update (increase j by 1), do: k := 0 for initialize i := 0, when i < m, update (increase i by 1), do: k := k + arr[j, i] V := maximum of V and k return V
아래 구현을 살펴보겠습니다. 더 잘 이해하기 위해 −
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; const int modval = (int) 1e9 + 7; #define N 100 int solve(int n, int m, vector<tuple<int, int, int>> ratings) { int V, arr[9][N] ; vector<int> ans ; for(int i = 0 ; i < n ; i++) { int a, b, c; tie(a, b, c) = ratings[i]; arr[1][i] = a + b + c ; arr[2][i] = a - b - c ; arr[3][i] = a + b - c ; arr[4][i] = a - b + c ; arr[5][i] = -a + b + c ; arr[6][i] = -a - b - c ; arr[7][i] = -a + b - c ; arr[8][i] = -a - b + c ; } for(int i = 1 ; i <= 8 ; i++) sort(arr[i] , arr[i] + n) ; for(int i = 1 ; i <= 8 ; i++) reverse(arr[i] , arr[i] + n) ; if (m == 0) V = 0 ; else { for (int j = 1; j <= 8; j++) { int k = 0; for (int i = 0; i < m; i++) k += arr[j][i]; V = max(V, k); } } return V; } int main() { int n = 6, m = 4; vector<tuple<int, int, int>> ratings = {{2, 3, 5}, {3, 5, 2}, {4, 8, 5}, {1, 5, 3}, {7, 2, 7}, {4, 3, 6}}; cout<< solve(n, m, ratings); return 0; }
6, 4, {{2, 3, 5}, {3, 5, 2}, {4, 8, 5}, {1, 5, 3}, {7, 2, 7}, {4, 3,6}}
56
위 내용은 정격 부품의 최대 세트를 찾는 C++ 프로그램의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!