Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将对象分为两组时最大化幸福感的算法_Algorithm_Dynamic Programming_Greedy - Fatal编程技术网

Algorithm 将对象分为两组时最大化幸福感的算法

Algorithm 将对象分为两组时最大化幸福感的算法,algorithm,dynamic-programming,greedy,Algorithm,Dynamic Programming,Greedy,你有一个n个水果数组,你必须给2个人,X和Y。X在吃第i个水果时会获得X_i快乐,Y在吃第i个水果时会获得Y_i快乐。我们想要最大化X和Y的总体幸福感。水果的分布不一定是相等的——你可以把它们全部给X或全部给Y 您必须按顺序(从第一个水果到第n个水果)将水果给X和Y,X和Y在收到水果后会立即摄入水果 在味觉指标上存在一些差异,影响着X和Y吃每种水果的快乐程度。该差异由函数T(i,j)定义,并可在表中查找(查找成本为O(1))。因此,如果X刚刚摄入了水果i,然后被给予水果j,那么X的幸福感将增加(

你有一个n个水果数组,你必须给2个人,X和Y。X在吃第i个水果时会获得X_i快乐,Y在吃第i个水果时会获得Y_i快乐。我们想要最大化X和Y的总体幸福感。水果的分布不一定是相等的——你可以把它们全部给X或全部给Y

您必须按顺序(从第一个水果到第n个水果)将水果给X和Y,X和Y在收到水果后会立即摄入水果

在味觉指标上存在一些差异,影响着X和Y吃每种水果的快乐程度。该差异由函数T(i,j)定义,并可在表中查找(查找成本为O(1))。因此,如果X刚刚摄入了水果i,然后被给予水果j,那么X的幸福感将增加(X_j-T(i,j))

我觉得这个问题应该通过动态规划或贪婪算法来解决,但我在制定解决方案时遇到了困难。到目前为止我所做的:


我知道蛮力是(2^n),因为所有分配给X和Y的水果组合都是2^n。我试着用[I,j,k]做一个DP,I和j是开始和结束的水果,n和k是你给第一人称的水果的数量(X)。对于DP[0,n,k]中的任何k,该DP的解都是max over k,但我似乎无法超越基本情况(我很难建立DP[I,j,k]的方程)…

这可以使用动态规划在n的二次时间内求解。设f(i,j)是最大可能的幸福,如果X吃的最后一个水果是i,Y吃的最后一个水果是j。让我把第一个水果称为水果编号0,把最后一个水果称为编号n-1(0-1)。然后,您需要计算f(-1,-1)(最初他们没有吃任何水果)

这种动态规划很容易计算,因为如果你知道他们两人最后吃的水果,你就知道下一个要吃的水果

以下类似C的伪代码包含详细信息:

int dp(int i, int j) {
  //Get the current fruit
  int current = max(i, j) + 1;

  //Base case (I consider the first to be 0, so the last is n - 1)
  if (current == n) return 0;

  //Check if the value is calculated
  if (not calculated[i][j]) {
    calculated[i][j] = true;
    M[i][j] = max(dp(current, j) + x[current] - T(i, current), 
                  dp(i, current) + y[current] - T(j, current));
  }

  return M[i][j];
}

在问这个问题之前,你应该表现出一些努力。到目前为止,我只能够想到并证明蛮力(2^n):(我试着用[I,j,k]做DP)i和j是开始和结束的结果,n和k是你给第一人称的结果数,但我似乎无法超越基本情况……这很有意义!如果i==j,解是否也应该返回-无穷大(或类似的情况)虽然?因为我们不应该给X和Y同样的结果。虽然这不会错,但它不是必需的,因为如果你从dp(-1,-1)开始(除了原来的(-1,-1),这是特别的),就不能达到这个状态。这是因为在每个状态下,我们选择下一个结果(当前)我们只把它分配给其中一个,所以不可能达到他们都吃了最后一个水果的状态。