C++ C++;划分算法
我的任务是: 您有N个项目的重量是s1,s2。。。锡。程序必须将项目分为两组,以便项目重量尽可能相似 我找到了一个很好的解释来解决这个问题(作者:Abhiraj Smit):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
//求解最小和划分的递归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;
}