求一个数组中,是否有 和值 为某值

ynszx 2012-02-11 10:08:07
怎样快速判断一个数组中,和值(任意1个或几个的和) 是否 等于某值:

例:

有数组: int v[10]={1,2,3,4,5,6,7,8,9,10};//数组值任意

是否存在:v[0] + v[2] + ... + v[9]=35; //数组中任意几个的和是否存在和值为35。

存在输出这几个数,不存在输出其他标记。

...全文
167 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianchx 2012-11-16
  • 打赏
  • 举报
回复
引用 7 楼 wangjunsheng 的回复:
int cnt; void printa(int a[], int used[], int n) { ++cnt; for (int i = 0; i < n; ++i) { if (used[i]) cout<< a[i] << " "; } cout << endl; ……
啥啊。。看不懂。。解释一下吧。。。代码里面的两个递归什么逻辑啊????高手,求解释!!!
ynszx 2012-02-15
  • 打赏
  • 举报
回复
和为35的答案:
1 2 3 4 6 9 10
1 2 3 4 7 8 10
1 2 3 5 6 8 10
1 2 3 5 7 8 9
1 2 4 5 6 7 10
1 2 4 5 6 8 9
1 2 5 8 9 10
1 2 6 7 9 10
1 3 4 5 6 7 9
1 3 4 8 9 10
1 3 5 7 9 10
1 3 6 7 8 10
1 4 5 6 9 10
1 4 5 7 8 10
1 4 6 7 8 9
1 7 8 9 10
2 3 4 5 6 7 8
2 3 4 7 9 10
2 3 5 6 9 10
2 3 5 7 8 10
2 3 6 7 8 9
2 4 5 6 8 10
2 4 5 7 8 9
2 6 8 9 10
3 4 5 6 7 10
3 4 5 6 8 9
3 5 8 9 10
3 6 7 9 10
4 5 7 9 10
4 6 7 8 10
5 6 7 8 9
ynszx 2012-02-15
  • 打赏
  • 举报
回复
感谢 wangjunsheng 。是的应该全了,

是我没注意,数组中没写全。
bingqi23 2012-02-14
  • 打赏
  • 举报
回复
算法哇···
乃不知有汉 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ynszx 的回复:]
问题基本解决 ,感谢!但是大家的代码似乎没有完全输出所有可能的答案。
[/Quote]
我的是 暴力穷举
所有解啊
赵4老师 2012-02-14
  • 打赏
  • 举报
回复
仅供参考
//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;
}
ynszx 2012-02-14
  • 打赏
  • 举报
回复
问题基本解决 ,感谢!但是大家的代码似乎没有完全输出所有可能的答案。

乃不知有汉 2012-02-11
  • 打赏
  • 举报
回复
int cnt;
void printa(int a[], int used[], int n)
{
++cnt;
for (int i = 0; i < n; ++i)
{
if (used[i])
cout<< a[i] << " ";
}
cout << endl;
}

void tt(int a[], int n, int sum, int used[], int i)
{
if (i >= n)
return;

used[i] = 1;
if ( sum == a[i] )
printa(a, used, n);
else
tt(a, n, sum-a[i], used, i+1);

used[i] = 0;
tt(a, n, sum, used, i+1);
}

void main()
{
int a[] = {1,2,3,5,6,7,8,9,10};
const int n = sizeof(a)/sizeof(a[0]);

int used[n] = {0};

tt(a, n, 40, used, 0);

if (0 == cnt)
cout << "impossibility\n";
}
taodm 2012-02-11
  • 打赏
  • 举报
回复
因为和仅为35,可以用01背包来解,具体搜索 背包9讲
cao_julians 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 quwei197874 的回复:]
最简单的想法就是用穷举法
[/Quote]
++
为每一个元素v[i]配置一个选择因子w[i](取值为0或者1)
则构造求和式(循环法)sum=w[0]*v[0] + w[1]*v[1] + ...... + w[9]*v[9]
表示求和中取或舍某些v[i]
这类题目训练的是“待求解集合的完整性”
尘缘udbwcso 2012-02-11
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
bool isSum(int num, int *v, int length)
{
int *mark = new int[length+1];
int i, sum;
for(i = 0; i < length; ++i)
if(num == v[i])
{
cout<<v[i]<<endl;
delete[] mark;
return true;
}
for(i = 0; i < length+1; ++i)
mark[i] = 0;
while(mark[length] == 0)
{
++mark[0];
for(i = 0; i < length; ++i)
{
if(mark[i] >= 2)
{
mark[i] -= 2;
++mark[i+1];
}
}
sum = 0;
for(i = 0; i < length; ++i)
{
sum += mark[i] * v[i];
}
if(sum == num)
{
for(i = 0; i < length; ++i)
if(mark[i] != 0)
cout<<" "<<v[i];
cout<<endl;
delete[] mark;
return true;
}
}
delete[] mark;
return false;
}

int main()
{
int v[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int num = 25;
//cin>>num;
if(!isSum(num, v, 10))
cout<<"不存在和值为"<<num<<endl;
return 0;
}


quwei197874 2012-02-11
  • 打赏
  • 举报
回复
最简单的想法就是用穷举法
qq120848369 2012-02-11
  • 打赏
  • 举报
回复
DP问题,参考编程之美。

bool dp[n][sum]表示n个数是否能组成和为sum.
hitcser01 2012-02-11
  • 打赏
  • 举报
回复
编程难道以后很多这些问题么?(那我悲剧了!!!伤不起!)

先排序,再累加,再移动?神马算法还没学过,想着就头疼
程序员小迷 2012-02-11
  • 打赏
  • 举报
回复


void isArrSomeElementsSumIs(int arr[], int cnt, int total, int start, int point)
{
// swap arr[start] arr[point]
int temp = arr[start];
arr[start] = arr[point];
arr[point] = temp;

if (temp == total)
{
for (int j = 0; j < point; j++)
{
cout << arr[j] << " ";
}
cout << temp << endl;
}
else
{
for (int i = start + 1; i < cnt; i++)
{
isArrSomeElementsSumIs(arr, cnt, total - temp, i, point + 1);
}
}

arr[point] = arr[start];
arr[start] = temp;

}


void testIsArrSomeElementsSumIs()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
isArrSomeElementsSumIs(arr, sizeof(arr) / sizeof(arr[0]), 35, 0, 0);
}

64,642

社区成员

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

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