Arrays 分区和算法

Arrays 分区和算法,arrays,algorithm,list,sum,partition,Arrays,Algorithm,List,Sum,Partition,我被要求接受一个整数列表,并将它们分成两个和相等的分区。例如,1 3 5 7的列表将被划分为1+7和3+5。这是我到目前为止的代码。我只是在一条比蛮力更快的道路上停滞不前 #include <iostream> using namespace std; int main() { int input,n,temp,sum = 0; int Asum, Bsum; cout << "Number of inputs: "; cin >>

我被要求接受一个整数列表,并将它们分成两个和相等的分区。例如,1 3 5 7的列表将被划分为1+7和3+5。这是我到目前为止的代码。我只是在一条比蛮力更快的道路上停滞不前

#include <iostream>


using namespace std;

int main()
{
   int input,n,temp,sum = 0;
   int Asum, Bsum;
   cout << "Number of inputs: ";
   cin >> n;
   cout << "Enter " << n << " numbers: ";
   int arr[n];
   int partA[n/2];
   int partB[n/2];

   for(int i = 0; i < n; i++)
   {
       cin >> temp;
       arr[i] = temp;
   }
   for(int i = 0; i < n; i ++)
    sum += arr[i];
   cout << sum;

   if(sum %2 !=0)
   {
       cout << "No partition";
   }
   else
   {
       sum/=2;
   }


   return 0;
}
#包括
使用名称空间std;
int main()
{
整数输入,n,温度,和=0;
华硕国际大学;
cout>n;

cout所以在这里,我们可以将dp状态保持为
dp[idx][sum1]
,其中idx指数组中的当前索引,sum1是分区1的和,使用这两个参数,我们可以提取第三个参数sum2(sum2=totalSum-sum1),这将帮助我们减少状态数,rest是一个简单的递归dp解决方案

#include<bits/stdc++.h>

using namespace std;

int n, arr[100], tot, dp[100][100000], mark[100];
int solve(int idx, int sum1){
    if(idx == n){
        int sum2 = tot - sum1;
        //cout << sum1 << " " << sum2 << endl;
        if(sum1 == sum2) return 1;return 0;
    }
    if(dp[idx][sum1] != -1) return dp[idx][sum1];
    int v1 = 0, v2 = 0;
    v1 = solve(idx+1, sum1);
    v2 = solve(idx+1, sum1 + arr[idx]);
    if(v1 + v2 > 0) dp[idx][sum1] = 1;
    else dp[idx][sum1] = 0;
    return dp[idx][sum1];
}

void check(int idx, int sum1){
    if(idx == n) return;
    int v1 = solve(idx+1, sum1);
    int v2 = solve(idx+1, sum1 + arr[idx]);
    if(v1 == 1){
        mark[idx] = 1;
        check(idx+1, sum1);
    }else{
        mark[idx] = 2;
        check(idx+1, sum1 + arr[idx]);
    }
}

int main(){
    cin >> n;
    for(int i = 0;i < n;i++) cin >> arr[i], tot += arr[i];
    memset(dp, -1, sizeof dp);
    int ct = solve(0, 0);
    if(ct == 0){
        cout << "No Partition" << endl;
    }else{
        check(0, 0);
        for(int i = 0;i < n;i++) if(mark[i] == 1) cout << arr[i] << " ";cout << endl;
        for(int i = 0;i < n;i++) if(mark[i] == 2) cout << arr[i] << " ";cout << endl;
    }
}
#包括
使用名称空间std;
整数n、arr[100]、tot、dp[100][100000]、马克[100];
整数解算(整数idx,整数sum1){
如果(idx==n){
int sum2=tot-sum1;
//cout>arr[i],tot+=arr[i];
膜组(dp,-1,dp大小);
int-ct=solve(0,0);
如果(ct==0){

cout所以在这里,我们可以将dp状态保持为
dp[idx][sum1]
,其中idx指数组中的当前索引,sum1是分区1的和,使用这两个参数,我们可以提取第三个参数sum2(sum2=totalSum-sum1),这将帮助我们减少状态数,rest是一个简单的递归dp解决方案

#include<bits/stdc++.h>

using namespace std;

int n, arr[100], tot, dp[100][100000], mark[100];
int solve(int idx, int sum1){
    if(idx == n){
        int sum2 = tot - sum1;
        //cout << sum1 << " " << sum2 << endl;
        if(sum1 == sum2) return 1;return 0;
    }
    if(dp[idx][sum1] != -1) return dp[idx][sum1];
    int v1 = 0, v2 = 0;
    v1 = solve(idx+1, sum1);
    v2 = solve(idx+1, sum1 + arr[idx]);
    if(v1 + v2 > 0) dp[idx][sum1] = 1;
    else dp[idx][sum1] = 0;
    return dp[idx][sum1];
}

void check(int idx, int sum1){
    if(idx == n) return;
    int v1 = solve(idx+1, sum1);
    int v2 = solve(idx+1, sum1 + arr[idx]);
    if(v1 == 1){
        mark[idx] = 1;
        check(idx+1, sum1);
    }else{
        mark[idx] = 2;
        check(idx+1, sum1 + arr[idx]);
    }
}

int main(){
    cin >> n;
    for(int i = 0;i < n;i++) cin >> arr[i], tot += arr[i];
    memset(dp, -1, sizeof dp);
    int ct = solve(0, 0);
    if(ct == 0){
        cout << "No Partition" << endl;
    }else{
        check(0, 0);
        for(int i = 0;i < n;i++) if(mark[i] == 1) cout << arr[i] << " ";cout << endl;
        for(int i = 0;i < n;i++) if(mark[i] == 2) cout << arr[i] << " ";cout << endl;
    }
}
#包括
使用名称空间std;
整数n、arr[100]、tot、dp[100][100000]、马克[100];
整数解算(整数idx,整数sum1){
如果(idx==n){
int sum2=tot-sum1;
//cout>arr[i],tot+=arr[i];
膜组(dp,-1,dp大小);
int-ct=solve(0,0);
如果(ct==0){

如果我选择你的大脑,这可以用动态编程思维来完成吗?@u\u似乎很惊讶我们可以将dp状态保持为
dp[idx][sum]为了解决这个问题,我想我可以在C++中写一个递归的DP解决方案。@ U.Simuly惊奇,谢谢一位朋友。非常感谢。如果不是太麻烦,你能解释一下这个概念吗?我很难解释这里的动态编程的概念,我建议你学习BoFO。重新理解这个答案。另外,你上面发布的代码是不正确的。正确的蛮力需要回溯。这可以通过使用动态编程思想来完成,如果我选择你的大脑一点?@u\u似乎很惊讶我们可以将dp状态保持为
dp[idx][sum]为了解决这个问题,我想我可以在C++中写一个递归的DP解决方案。@ U.Simuly惊奇,谢谢一位朋友。非常感谢。如果不是太麻烦,你能解释一下这个概念吗?我很难解释这里的动态编程的概念,我建议你学习BoFO。重新理解此答案。另外,您上面发布的代码不正确。正确的暴力将需要回溯。非常感谢。我将研究此代码,并确保我了解这里发生的一切。非常感谢您的时间。非常感谢。我将研究此代码并确保我理解ev这里发生的一切。非常感谢您抽出时间。