Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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
C++ C++;划分算法_C++_Partition_Knapsack Problem - Fatal编程技术网

C++ C++;划分算法

C++ C++;划分算法,c++,partition,knapsack-problem,C++,Partition,Knapsack Problem,我的任务是: 您有N个项目的重量是s1,s2。。。锡。程序必须将项目分为两组,以便项目重量尽可能相似 我找到了一个很好的解释来解决这个问题(作者:Abhiraj Smit): //求解最小和划分的递归C程序 //问题。 #包括 使用名称空间std; //函数来查找最小和 int findMinRec(int arr[],int i,int SUMCOMPUTED,int SUMTOTALL) { //如果我们已经到达最后一个元素,那么是1的和 //计算子集之和,其他子集之和为 //sumTota

我的任务是:

您有N个项目的重量是s1,s2。。。锡。程序必须将项目分为两组,以便项目重量尽可能相似

我找到了一个很好的解释来解决这个问题(作者:Abhiraj Smit):

//求解最小和划分的递归C程序
//问题。
#包括
使用名称空间std;
//函数来查找最小和
int findMinRec(int arr[],int i,int SUMCOMPUTED,int SUMTOTALL)
{
//如果我们已经到达最后一个元素,那么是1的和
//计算子集之和,其他子集之和为
//sumTotal sumCalculated。返回绝对差
//两个总数。
如果(i==0)
返回abs((总和总和总和总和计算)-总和计算);
//对于每个项目arr[i],我们有两个选择
//(1)我们不包括第一套
//(2)我们把它包括在第一套中
//我们至少返回两个选项
返回最小值(findMinRec(arr,i-1,SUM计算+arr[i-1],SUM总计),
findMinRec(arr,i-1,SUMCounted,SUMTOTALL);
}
//返回和之间的最小可能差
//两个子集
int findMin(int arr[],int n)
{
//计算元素的总和
int-sumTotal=0;

对于(int i=0;i您需要这样的东西吗:

#include<iostream>
#include<math.h>
using namespace std;
int lim, ans = 0, k, min1 = INT_MAX;
int a[] = { 3, 1, 4, 2, 2, 1 };
int n = sizeof(a) / sizeof(a[0]);
int bit;
int main()
{
    lim = 1 << n;
    for (int i = 1; i < lim; i++)
    {
        k = 0;
        for (int j = 1; j < (1 << n); (j = j << 1))
        {
            if (i&j)
                ans += a[k];
            else ans -= a[k];
            k++;
        }
        k = 0;
        if (min1 > abs(ans)) {
            min1 = abs(ans);
            bit = i;
        }

        ans = 0;

    }
    cout << min1 << endl;
    cout << bit << endl;
    int temp = 1;


    for (int i = 0; i < n; i++) {
        if (bit&temp) cout << a[i] << " ";
        temp = temp << 1;
    }
    cout << endl;
    temp = 1;
    for (int i = 0; i < n; i++) {
        if (!(bit&temp)) cout << a[i] << " ";
        temp = temp << 1;
    }
    return 0;
}
#包括
#包括
使用名称空间std;
int lim,ans=0,k,min1=int_MAX;
inta[]={3,1,4,2,2,1};
int n=sizeof(a)/sizeof(a[0]);
整数位;
int main()
{

lim=1
#include
-。包含正确的头文件。此代码取自一个网站,我修复了它,因此您只需要跟踪运行总数旁边的完整递归路径。您可以用值类型替换整数和来完成此操作(您只需要每级1位来跟踪执行哪个分支)如果
运算符只是一个注释,则上述算法非常慢,运行时间为O(2^n)。更好的方法是只运行一个二进制背包算法,目标和为总和的一半。
#include<iostream>
#include<math.h>
using namespace std;
int lim, ans = 0, k, min1 = INT_MAX;
int a[] = { 3, 1, 4, 2, 2, 1 };
int n = sizeof(a) / sizeof(a[0]);
int bit;
int main()
{
    lim = 1 << n;
    for (int i = 1; i < lim; i++)
    {
        k = 0;
        for (int j = 1; j < (1 << n); (j = j << 1))
        {
            if (i&j)
                ans += a[k];
            else ans -= a[k];
            k++;
        }
        k = 0;
        if (min1 > abs(ans)) {
            min1 = abs(ans);
            bit = i;
        }

        ans = 0;

    }
    cout << min1 << endl;
    cout << bit << endl;
    int temp = 1;


    for (int i = 0; i < n; i++) {
        if (bit&temp) cout << a[i] << " ";
        temp = temp << 1;
    }
    cout << endl;
    temp = 1;
    for (int i = 0; i < n; i++) {
        if (!(bit&temp)) cout << a[i] << " ";
        temp = temp << 1;
    }
    return 0;
}