网上看到的面试题,一直没思路

大写的K 2014-10-05 02:44:24
有N 个正实数(注意是实数,大小升序排列) x 1 , x 2 ... x N ,另有一个实数M。 需要选出若干个x ,使这几个x 的和与 M 最接近。 请描述实现算法,并指出算法复杂度
...全文
226 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-10-08
  • 打赏
  • 举报
回复
仅供参考
//n个(2<=n<=20)整数(整数范围-10<=x<=10),判断是否可以从这n个数中找到若干个数,其和为10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using namespace std;
int MAXN=20;
int MINN=2;
int x[20];
int n,i,j,k,sum;
int main() {
    srand((unsigned)time(NULL));
    n=MINN+rand()%(MAXN-1);
    for (i=0;i<n;i++) {
        x[i]=-10+rand()%21;
        printf("%d,",x[i]);
    }
    printf("\n");
    sort(&x[0],&x[n]);
    do {
        for (i=2;i<=n;i++) {
            sum=0;
            k=n/2-i/2;
            for (j=k;j<k+i;j++) {
                sum+=x[j];
            }
            if (10==sum) {
                for (j=k;j<k+i;j++) {
                    if (j==k+i-1) {
                        printf("%d==10\n",x[j]);
                    } else {
                        printf("%d+",x[j]);
                    }
                }
                printf("YES\n");
                return 1;
            }
        }
    } while (next_permutation(&x[0],&x[n]));
    printf("NO\n");
    return 0;
}
Uron 2014-10-08
  • 打赏
  • 举报
回复
N的平方;从后往前,找到最后一个大于m的Max和第一个小于Min,然后从Min往前找能加起来小于m的最大值Min2;最后一步,比较Min2和Max哪个更小。
li4c 2014-10-07
  • 打赏
  • 举报
回复
先将m与数组所有的数求差,让后对差求绝对值,对绝对值排序,前x个就是最小的距离,通过这个距离来找出对应的数
勤奋的小游侠 2014-10-05
  • 打赏
  • 举报
回复
这是背包问题,只是这个背包没有容量的限制。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧