经典算法详解(8)数的分组

小编 2026-06-26 阅读:1874 评论:0
题目:有10个任意的正整数,将其分为两组A和B,要求组A中每个数据的和与组B中每个数据的和之差的...

题目:有10个任意的正整数,将其分为两组A和B,要求组A中每个数据的和与组B中每个数据的和之差的绝对值最小。请设计算法实现数的分组(找出一个答案即可)。

C++版本:

 1 #include<iostream> 2  3 using namespace std; 4  5 void get_groupAB(int arr[]) { 6     int sum_a, sum_b; 7     int index, difference=0; 8     int i,i_copy; 9     //数组所有的元素求和给difference赋初值10     for ( i = 0; i < 10; i++) {11         difference += arr[i];12     }13     //从0000000000到1111111111,尾数为零时,对应的数组元素划分给a数组,否则划分给b数组14     for ( i = 0; i < 0x3FF; i++) {            15         sum_a = 0, sum_b = 0;16         i_copy=i;17         for (int j = 0; j < 10; j++) {18             if ((i_copy & 1) == 0) {19                 sum_a += arr[9 - j];20             }21             else {22                 sum_b += arr[9 - j];23             }24             i_copy >>= 1;25         }26         if (difference > abs(sum_a - sum_b)) {27             difference = abs(sum_a - sum_b);28             index = i;            //存储最小值对应的索引29         }30         if (difference == 0) {31             break;32         }33     }34     //存储分组35     int sub_a[10], sub_b[10];36     int count_a=0, count_b=0;37     for (i = 0; i < 10; i++) {38         if ((index & 1) == 0) {39             sub_a[count_a] = arr[9 - i];40             count_a++;41         }42         else {43             sub_b[count_b] = arr[9 - i];44             count_b++;45         }46         index >>= 1;47     }48     //输出显示部分49     cout << "group A:" << endl;50     for (i = 0; i < count_a; i++) {51         cout << sub_a[i] << endl;52     }53     cout << "group B:" << endl;54     for (i = 0; i < count_b; i++) {55         cout << sub_b[i] << endl;56     }57     cout << "difference:" << difference << endl;58 }59 60 int main(int argc, char *argv[]) {61 62     int arr[10];63     int i=0;64     while (i < 10) {65         cin >> arr[i];66         i++;67     }68     get_groupAB(arr);69     getchar();70     getchar();71     return 0;72 }

思路:可以用一个10位的二进制数表示,对应位置为零时,分给一个组,为1时分给另外一个组;任何一个数都可以分给组A或者组B两种情况,故总的情况共有2^10,即1024种,其中不能全给A,也不能全给B,所以总共1024-2=1022种情况,进行枚举即可。另外如果出现差值为0时可以马上终止循环,因为不可能出现比0小的数了。

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表