初入DP

给你一行数字,可任选数字(相邻数字不能选)求和,求最大值

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;

}
 

猜你喜欢

转载自blog.csdn.net/pyhonlong/article/details/81225534