簡體   English   中英

用於查找數字集合的算法是否可以加起來X,具有約束直方圖

[英]Algorithm for finding if set of numbers can add up to X, with constrained histogram

(動機:考慮一個問題,你必須從一群可用的球員中選擇一支運動隊。每個球員都有一定的技能水平與他們的薪水期望完全成正比,你希望這個技能/工資水平的總和完全匹配你的總工資上限。)

我需要編寫以下函數:

 bool possibleAssignment(int N, int M, int T, vector<int> H);

輸入約束是:

  • 0 < N <= 50
  • 0 < M <= 50
  • 0 < T <= 2500
  • H.size() == N + 1
  • Forall i0 <= H[i] <= M

如果可以使用以下三個約束分配M個int的數組X,則possibleAssign返回true:

  1. Forall i0 <= X[i] <= N
  2. Forall v ,值為vX元素的數量為<= H [v]
  3. X的總和是T.

通過什么算法或方法可以實現possibleAssign?

這個問題似乎可以從子集和問題中減少 ,或者它是更好的已知變量: 背包問題 ,它是NP-Hard,因此沒有已知的多項式解決方案。

然而,似乎T足夠小,幸運的是,有一個使用DP的問題的偽多項式解決方案

因為問題已經類似於背包問題, 我會嘗試減少問題以適應背包問題 ,然后調用DP算法來找到背包問題的最佳解決方案:

我首先過濾列表,只保留值為v的H [v]元素。現在,設置elemets如下:

value(x) = 1
weight(x) = x
Bag size = T

這將使您前進 - 為您提供可以使用工資約束T分配的最大數量的元素

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM