64,642
社区成员
发帖
与我相关
我的任务
分享
//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;
}
#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;
}
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);
}