给你一行数字,可任选数字(相邻数字不能选)求和,求最大值
Input:
第一行是整数N
第二行是N个整数
Output:
输入这个最大值
Examples
input:
5
4 1 1 9 1
output:
13 //选 4 9 =13
input:
7
1 2 4 1 7 8 3 // 选1 4 7 3 =15
output:
15
对于第i个数有2种状态 选或不选
选:opt(i) = opt(i-2) + arr[i];
不选:opt(i) = opt(i-1);
所以取二者中最大的数 即:opt(i) = Max(opt(i-2)+arr[i] , opt(i-1))
另:
opt[0] = arr[0] //只有一个数.
opt[1] = Max(arr[0],arr[1]) // 二个数,应选择其中大的数
代码如下:
给出一行正整数数字集合,从中人选n个数字能否组成s(s给出)
Input:
输入有三行
第一行 一个N
第二行 N个数字
第二行 S
Onput:
输出只有一行
能组成输出"True",否则输出"False"
Example
input:
5
3 34 4 5 12 2
7
output:
True //选 3 4 =7
input:
5
1 1 1 1 1 // 选1 1 1 1 1 =5
output:
True
对于第i个数有2种状态 选或不选 从后往前递推
选: subset(arr,i-1,s-a[i])
不选:subset(arr,i-1,s);
有三个出口
1: 此时 s ==0
2: arr[0] == s //递推到最后一个, 此时恰好等于s
3.arr[i]>s : 跳过,继续下一个
return subset(arr,i-1,s)
给出代码:
#include<iostream>
using namespace std;
bool subset(int *a,int i,int s)
{
if(s==0)
return true;
else if(i == 0)
return a[0] == s;
else if(a[i]>s)
return subset(a,i-1,s);
else
{
bool A,B;
A = subset(a,i-1,s-a[i]); //选
B = subset(a,i-1,s); //不选
return A||B; //只需要任意一种能够满足 输出True
}
}
int main()
{
int arr[100];
int N;
int S;
cin>>N;
for(int i=0;i<N;i++)
cin>>arr[i];
cin>>S;
cout<<(subset(arr,N,S)?"Yes":"No");
return 0;
}