69,382
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include<bitset>
#include<vector>
using namespace std;
int ab(int m)
{
if(m<0)
return -m;
return m;
}
int main()
{
int n=0,m=0,num=0;
int sum=0,temp=0,max=100;
cin>>n;
vector<int>arry;
for(int i=0;i<n;++i)
{
cin>>m;
arry.push_back(m);
}
cin>>num;
bitset<32>x;
for(int i=0;i<1<<n;++i)
{
x=i;
sum=0;
for(int j=0;j<n;++j)
{
if(x[j])
sum+=arry[j];
}
temp=sum-num;
temp=ab(temp);
if(temp<max)
{
max=temp;
}
}
cout<<max<<endl;//这个输出差值
for(int j=0;j<n;++j)
if(x[j])
cout<<arry[j];//输出相应的组合
cout<<endl;
}
1>正在链接...
1>正在生成代码
1>已完成代码的生成
1>正在嵌入清单...
3
1 2 3
8
2
123
请按任意键继续. . .
//先Mark
#include "stdlib.h"
#include "math.h"
#define max_int 2147483647
#define min(a,b) (((a) < (b)) ? (a) : (b))
int get_min_dif(int* data, int cur_sum, int cnt, int num, int* min_dif)
{
int i = -1;
while (++i < cnt)
{
if (abs(cur_sum - num) > *min_dif && cur_sum - num > 0)
continue;
(*min_dif) = min(abs(cur_sum - num), *min_dif);
get_min_dif(data + 1, cur_sum, cnt - 1, num, min_dif);
if (abs(cur_sum + (*data)- num) > *min_dif && cur_sum - num > 0)
continue;
(*min_dif) = min(abs(cur_sum + (*data)- num), *min_dif);
get_min_dif(data + 1, cur_sum + (*data), cnt - 1, num, min_dif);
++i;
}
}
int main()
{
int* data = 0;
int cnt = 0;
int num = 0;
int i = 0;
int dif = max_int;
printf("input : \n");
scanf("%d", &cnt);
if (cnt <= 0)
return 1;
data = (int*)malloc(sizeof(int) * cnt);
while (i < cnt)
scanf("%d", &data[i++]);
scanf("%d", &num);
get_min_dif(data, 0, cnt, num, &dif);
printf("\noutput : \n%d\n", dif);
free(data);
return 0;
}
--------
运行
input :
10
1 2 3 4 5 6 7 8 9 10
58
output :
3
随便写了个效率极其低的穷举法,你参考一些就是了
#include "stdlib.h"
#include "math.h"
#define max_int 2147483647
#define min(a,b) (((a) < (b)) ? (a) : (b))
int get_min_dif(int* data, int cur_sum, int cnt, int num, int* min_dif)
{
int i = 0;
while (i < cnt)
{
(*min_dif) = min(abs(cur_sum - num), *min_dif);
get_min_dif(data + 1, cur_sum, cnt - 1, num, min_dif);
(*min_dif) = min(abs(cur_sum + (*data)- num), *min_dif);
get_min_dif(data + 1, cur_sum + (*data), cnt - 1, num, min_dif);
++i;
}
}
int main()
{
int* data = 0;
int cnt = 0;
int num = 0;
int i = 0;
int dif = max_int;
printf("input : \n");
scanf("%d", &cnt);
if (cnt <= 0)
return 1;
data = (int*)malloc(sizeof(int) * cnt);
while (i < cnt)
scanf("%d", &data[i++]);
scanf("%d", &num);
get_min_dif(data, 0, cnt, num, &dif);
printf("\noutput : \n%d\n", dif);
free(data);
return 0;
}
----------------
运行
input :
5
1 2 3 4 5
18
output :
3