C++11 找到子集';最小和划分的s

C++11 找到子集';最小和划分的s,c++11,c++14,subset,dynamic-programming,subset-sum,C++11,C++14,Subset,Dynamic Programming,Subset Sum,这是我使用DP进行最小和分区的代码 #include<bits/stdc++.h> using namespace std; int minPart(vector<int>v) { int sum = accumulate(v.begin(),v.end(),0); bool dp[v.size()+1][sum+1]; fill(*dp,*dp+(v.size()+1)*(sum+1),false); for(int i=0;i<=v.size()

这是我使用DP进行最小和分区的代码

#include<bits/stdc++.h>
using namespace std;
int minPart(vector<int>v)
{
  int sum = accumulate(v.begin(),v.end(),0);
  bool dp[v.size()+1][sum+1];
  fill(*dp,*dp+(v.size()+1)*(sum+1),false);
  for(int i=0;i<=v.size();i++)
  {
    dp[i][0]=true;
    for(int j=1;i>0 && j<=sum;j++)
    {
      dp[i][j]=dp[i-1][j];
      if(v[i-1]<=j)
        dp[i][j] |= dp[i-1][j-v[i-1]];
    }
  }
  int j = sum/2;
  while(j>=0 && !dp[v.size()][j]){
    j--;
  }
  return sum-2*j;
}
int main()
{
  vector<int> v = {10,20,15,5,25};
  cout<<minPart(v)<<endl;
  return 0;
}
#包括
使用名称空间std;
int minPart(矢量)
{
int sum=累加(v.begin(),v.end(),0);
bool-dp[v.size()+1][sum+1];
填充(*dp,*dp+(v.size()+1)*(总和+1),假);

对于(int i=0;i0&j>代码> BOOL DP[V.siZe()+1 ] [SUM+1 ];不是C++。我认为动态编程和记忆化可以在O(n ^ 2)中完成,而我不能在其他方面思考。way@Quimby谢谢你提到我更改了标签。@Berto99我认为我的代码的时间复杂度是O(n*sum)这是一个伪多项式时间复杂度,它是自下而上的记忆方法。@ HISHITHPRASADISBISH抱歉,我不清楚,VLAs不存在于任何标准C++版本中。它们本来是在C99中,但在C11中是可选的,所以一些编译器甚至在C++中仍然支持它们。使用<代码> STD::向量< /代码>。数组总是需要编译的。时间常数大小。