大小为N的给定数组之间的k个空格之间的n个数字的最小和

时间:2019-04-02 23:56:29

标签: java algorithm dynamic

使用动态编程,我必须找到一种有效的算法来解决以下问题:

作为输入,我们收到大小为N的随机数数组,其中int k是所选数字之间的最小距离,而int n是我们拥有的数字总数选择。 该问题的目的是找出n选择的数字的最小可能和。 我不知道该如何解决这个问题。

例如,如果我们具有以下数组:

arr = [5, 5, 3, 3, 2, 2, 3, 3, 5, 5, 5, 5, 5, 3, 2, 5]
N = 16
k = 4
n = 3

通过选择索引2、7和14的数字,输出将为8 (3+3+2)

1 个答案:

答案 0 :(得分:2)

我已经用c ++编写了解决方案,大多数情况下代码都可读,但是如果您对理解有歧义,请在下面评论。

#include<iostream>
#include<vector>
using namespace std;
int number_of_elements_to_be_picked, number_of_elements, k;
int main(){
      cin >> number_of_elements >> k >> number_of_elements_to_be_picked;
      vector<int> a(number_of_elements);
      vector<vector<int> > store(number_of_elements, vector<int> (number_of_elements_to_be_picked+1));
      for(int i = 0; i < number_of_elements; i++){
              cin >> a[i];
              store[i][1] = a[i];
      }
      for(int i = 0; i < number_of_elements; i++){
              for(int j = 2; j <= number_of_elements_to_be_picked; j++){
                      if(i == k*(j-1))
                              store[i][j] = store[i-k][j-1]+a[i];
                      else if(i > k*(j-1))
                              store[i][j] = min(store[i-k][j-1]+a[i], store[i-1][j]);
              }
      }
      cout << store[number_of_elements-1][number_of_elements_to_be_picked] << "\n";
      return 0;
}

编辑:我用作者的记法错误地命名了变量:-
N = number_of_elements,n = number_of_elements_to_be_picked,k = k