2010中兴一面试题,下午13点结贴。[要求准确无误,代码质量高!]

v_JULY_v
博客专家认证
2010-10-22 08:41:47
2010年中兴面试题
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来。

1.请看清题意,输入n和m,输出所有可能的解。
2.要求代码质量尽可能的高。
3.题目,不难。就贡献20分,只给一个人。其余接分党,下次再送吧。:)。
...全文
687 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
利弗莫尔混IT 2010-10-23
  • 打赏
  • 举报
回复
这个貌似java的也有这题~~
v_JULY_v 2010-10-22
  • 打赏
  • 举报
回复
准备结贴了。本打算 是不满意结贴,
但各位兄弟有劳。麻烦,多谢了。

便都散点把....:)。
v_JULY_v 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 shi3590 的回复:]
低调接分。

C/C++ code

int sum(int *t,int n)
{
int s=0;
for (int i=0;i<n;++i) s+=t[i]*(i+1);
return s;
}
void print(int *t,int n)
{
for (int i=0;i<n;++i)
{
if (t[……
[/Quote]

再最后,期待下。
zhu_nn 2010-10-22
  • 打赏
  • 举报
回复
这是背包问题的一个变形,遍历时需要回溯,也就是需要另外设置一个标记位
下面的代码是求m个数中,使其等于n的情况,稍微改进一下就行了

#include <stdio.h>
#include <stdlib.h>
#define num 10
#define true 1
#define false 0
int arrayflag[num];
void printarray(int arrayflag[],int array[])
{
for (int i=0;i<num;i++)
{

if (arrayflag[i])
{
printf("%-6d",array[i]);
}
}
printf("\n");
}
void bagProb(int array[],int sum,int m_i)
{
for (int i=m_i;i<num;i++)
{
if (array[i]<sum)
{
arrayflag[i]=true;
bagProb(array,sum-array[i],i+1);
arrayflag[i]=false;
}else{
if (array[i]==sum)
{
arrayflag[i]=true;
printarray(arrayflag,array);
arrayflag[i]=false;
}
}
}
}
int main()
{
for (int i=0;i<num;i++)
{
arrayflag[i]=false;
}
int array[num]={1,9,2,2,1,4,3,2,6,4};
bagProb(array,4,0);
return 0;
}
zhoulei0907 2010-10-22
  • 打赏
  • 举报
回复
高人 下山吧
v_JULY_v 2010-10-22
  • 打赏
  • 举报
回复
want me to paste it in advance?
shi3590 2010-10-22
  • 打赏
  • 举报
回复
低调接分。

int sum(int *t,int n)
{
int s=0;
for (int i=0;i<n;++i) s+=t[i]*(i+1);
return s;
}
void print(int *t,int n)
{
for (int i=0;i<n;++i)
{
if (t[i]) cout<<i+1<<" ";
}
cout<<endl;
}
void search(int m,int n,int *t,int p)
{
int s=sum(t,n);
if (m==s) print(t,n);
else if(m>s)
{
for (int i=p;i<n;++i)
{
++t[i];
search(m,n,t,i+1);
--t[i];
}
}
}
int main()
{
int m,n;
cout<<"m=";
cin>>m;
cout<<"n=";
cin>>n;
int *t=new int[n];
memset(t,0,sizeof(int)*n);
search(m,n,t,0);
delete []t;
return 0;
}
v_JULY_v 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 v_july_v 的回复:]
引用 7 楼 luciferisnotsatan 的回复:
lz来求笔试题的?那面试时怎么办,总不见得当着面试官的面上网求助


1.此非求,仅供 交流。
2.但,此为帖,非面试。
[/Quote]

说的准确点,目的:
1.提高结帖率而为。
2.顺便,看看大家,的思路(有无更好),和代码(有无质量更高)。
3.顺便,向 大方之家 学习下。
v_JULY_v 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luciferisnotsatan 的回复:]
lz来求笔试题的?那面试时怎么办,总不见得当着面试官的面上网求助
[/Quote]

1.此非求,仅供 交流。
2.但,此为帖,非面试。
luciferisnotsatan 2010-10-22
  • 打赏
  • 举报
回复
lz来求笔试题的?那面试时怎么办,总不见得当着面试官的面上网求助
太乙 2010-10-22
  • 打赏
  • 举报
回复
这不就是0-1背包问题么?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/************************************************************************/
/* 递归 */
/************************************************************************/
void getResult(int a[],int size,int N,int res[],int resSize)
{
if (size==1)
{
if(N==a[0])
{
for (int j=0;j<resSize;j++)
{
cout<<res[j]<<" ";
}
cout<<a[0];
cout<<endl;
}
return;
}
if(N==a[0])
{
for (int j=0;j<resSize;j++)
{
cout<<res[j]<<" ";
}
cout<<a[0];
cout<<endl;
}

res[resSize++] = a[0];
getResult(&a[1],size-1,N-a[0],res,resSize);
resSize--;
getResult(&a[1],size-1,N,res,resSize);
}
/************************************************************************/
/* 非递归 */
/************************************************************************/
void getResult(int a[],int size,int N)
{
vector<int> iv;
vector<int> indexv;
int back=0;
int sum=0;
while (back<size)
{
int front = back;
while (front!=size)
{
if (sum+a[front]<N)
{
iv.push_back(a[front]);
indexv.push_back(front);
sum+=a[front];
}
else if (sum+a[front]==N)
{
for (vector<int>::const_iterator it = iv.begin();it!=iv.end();it++)
{
cout<<*it<<" ";
}
cout<<a[front]<<endl;
if (iv.empty())
{
break;
}
sum-=iv.back();
iv.pop_back();
front = indexv.back();
indexv.pop_back();
if (iv.empty())
{
break;
}

}
else
{
sum-=iv.back();
iv.pop_back();
front = indexv.back();
indexv.pop_back();

if (iv.empty())
{
break;
}
}
front++;
}
sum = 0;
iv.clear();
indexv.clear();
back++;
}
}

void main()
{
int a[] = {1,1,3,5,8,9,1,10,13};//把这里初始化为0/1/2/3.../n
int b[sizeof(a)/sizeof(int)];
int N = 13;
sort(a,a+sizeof(a)/sizeof(int));//这里不需要排序了
getResult(a,sizeof(a)/sizeof(int),13,b,0);
getResult(a,sizeof(a)/sizeof(int),13);
}
v_JULY_v 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gaara777 的回复:]
貌似不是那么简单啊...又不能重复,,有m做界限..定义数组不知道可以不啊...我也是菜鸟来的啊...
[/Quote]

静候,暂不语。
gaara777 2010-10-22
  • 打赏
  • 举报
回复
貌似不是那么简单啊...又不能重复,,有m做界限..定义数组不知道可以不啊...我也是菜鸟来的啊...
v_JULY_v 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 swyinyuan 的回复:]
http://topic.csdn.net/u/20100929/18/ca9d2a3e-1bd8-4c8f-af28-6a244dbdebbb.html
[/Quote]

额,题目 有重复嫌疑啊。
再添2点:
1.不要给链接,懒得去看,杂乱无章。
2.注重代码的质量。能实现的一大推,好的寥寥无几。
kkk 2010-10-22
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100929/18/ca9d2a3e-1bd8-4c8f-af28-6a244dbdebbb.html
qiyunfeng01 2010-10-22
  • 打赏
  • 举报
回复
不好意思刚才只计算次数了,没有打印,所以仓促之下加上打印功能,有不足之处还望指正
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define N 30
4 struct stack
5 {
6 int size;
7 int *data;
8 };
9 struct stack *pstack = NULL;
10 void pop(struct stack *p)
11 {
12 if(p->size > 0)
13 p->size--;
14 }
15
16 void push(struct stack *p,int data)
17 {
18 p->size++;
19 *(p->data + p->size - 1) = data;
20 }
21
22 void print(struct stack *p)
23 {
24 int i = 0;
25 for(i = 0;i < p->size;i++)
26 printf("%d-",*(p->data + i));
27 printf("\n");
28 }
29
30 int n = 0;
31 int count = 0;
32 void load(int total,int start,int lastload)
33 {
34 if(start > n || total < 0)
35 return;
36 if(0 != lastload)
37 push(pstack,lastload);
38 if(0 == total)
39 {
40 count++;
41 print(pstack);
42 }
43 else
44 {
45 load(total,start+1,0);
46 load(total-start,start+1,start);
47 }
48 if(0 != lastload)
49 pop(pstack);
50 return;
51 }
52 int main()
53 {
54 pstack = (struct stack *)malloc(sizeof(struct stack));
55 if(NULL == pstack)
56 return -1;
57 pstack->size = 0;
58 pstack->data = (int *)malloc(N * sizeof(int));
59 if(NULL == pstack->data)
60 return -1;
61 int m = 0;
62 scanf("%d",&n);
63 scanf("%d",&m);
64 load(m,1,0);
65 printf("%d\n",count);
66 }
qiyunfeng01 2010-10-22
  • 打赏
  • 举报
回复

1 #include <stdio.h>
2 int n = 0;
3 int count = 0;
4 void load(int total,int start)
5 {
6 if(start > n || total < 0)
7 return;
8 if(0 == total)
9 count++;
10 else
11 {
12 load(total,start+1);
13 load(total-start,start+1);
14 }
15 return;
16 }
17 int main()
18 {
19 int m = 0;
20 scanf("%d",&n);
21 scanf("%d",&m);
if(n > m)
n = m;
22 load(m,1);
23 printf("%d\n",count);
24 }
~
勤奋的执着 2010-10-22
  • 打赏
  • 举报
回复
把你的算法共享下看看

65,189

社区成员

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

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