做个题

languagec 2008-09-24 10:51:19
假设一个数列有n个元素,一个数列的子数列是指在数列中任选m(0<m<=n) 个数组成的数列,如数列{1,2,3}的子数列有
{1}
{2}
{3}
{1,2}
{1,3}
{2,3}
{1,2,3}
数列的和是指数列中各个元素相加的值。
现在输入一个数NUM,求子数列的和与NUM 的最小的差值。
输入:
第一行输入数 n,代表数列的元素个数,第二行输入n个正整数,为数列的元素。
第三行输入数NUM
输出:
子数列与NUM 的最小差值

输入
3
1 2 3
8
输出
2
...全文
152 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdyjdao 2008-09-25
  • 打赏
  • 举报
回复
这题难点在第二行的输入上了,其实可以这样的:
个数不要输入了,直接输入第数列的值好了
include"math.h"
include"stdio.h"
void main(0)
{
long sum=0,x;
do{
scanf("%ld",&x);
sum+=x;
}while(getchar()!='\n')
scanf("%ld",&x);
sum=abs(sum-x);
printf("%ld',sum");
}
这就行了!!!
languagec 2008-09-25
  • 打赏
  • 举报
回复
呵呵
jieao111 2008-09-25
  • 打赏
  • 举报
回复

昨天晚上写得,现在才有电。至于c版的自己改吧,一个动态申请数组,我都不会了,呵呵只能用vector
#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
请按任意键继续. . .
xianyuxiaoqiang 2008-09-25
  • 打赏
  • 举报
回复
LS……迷惑
webtop1 2008-09-25
  • 打赏
  • 举报
回复
不好意思,刚才是c#的,现在改为vb
Private Sub ReadOrderData(ByVal connectionString As String)
Dim queryString As String = _
"SELECT OrderID, CustomerID FROM dbo.Orders;"

Using connection As New SqlConnection(connectionString)
Dim command As New SqlCommand(queryString, connection)
connection.Open()

Dim reader As SqlDataReader = command.ExecuteReader()

' Call Read before accessing data.
While reader.Read()
Console.WriteLine(String.Format("{0}, {1}", _
reader(0), reader(1)))
End While

' Call Close when done reading.
reader.Close()
End Using
End Sub
蘑菇摸骨 2008-09-25
  • 打赏
  • 举报
回复
想做饼子就面试啊!
ChamPagneZ 2008-09-25
  • 打赏
  • 举报
回复

//先Mark
星羽 2008-09-25
  • 打赏
  • 举报
回复
// 这样好像快了些



#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




或许可以先排序,那样可能效率更高些
星羽 2008-09-25
  • 打赏
  • 举报
回复

随便写了个效率极其低的穷举法,你参考一些就是了


#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

shtianhai 2008-09-24
  • 打赏
  • 举报
回复
没看明白,莫非就是把第二行输入数相加然后减掉第三行的数?
lw1a2 2008-09-24
  • 打赏
  • 举报
回复
看不懂
shtianhai 2008-09-24
  • 打赏
  • 举报
回复
来看看

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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