题目一:
假设有n个数 从n个数中找出任意个不相邻的数求和 计算出这个和的最大值
输入:
5
4 1 1 9 1
输出:
13
(最好的方案为4+9=13)
#include<iostream>
using namespace std;
int n;//n个数
int a[100]={0};
int mmax=0;
int dp[100];
int OPT(int n){//记忆化
if(n==0) return 0; //第一个出口 搜索到第一个数的前一个
if(n==1) return a[n];//搜索到第一个数
if(dp[n]!=0) return dp[n];//记忆当前的最大和
return dp[n]=max(OPT(n-2)+a[n],OPT(n-1));//选和不选
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
OPT(n);
cout<<dp[n]<<endl;
return 0;
}
题目二
给出n个数 给出一个和s 查找n个数中是否存在有任意个数相加和等于s 是输出true 否输出false
输入:
6 9
3 34 4 12 5 2
输出:
true
#include<iostream>
using namespace std;
int n;//n个数
int a[100];//数据
int s;//和
int dp[100];
bool Subset(int n,int s){
if(s==0) return true;//第一个出口 存在
if(n==0) return a[n]==s;// 第二个出口 搜索到最后一个
if(s<a[n]) return Subset(n-1,s);//第三个 相当于剪枝 当前数大于要组合的数,这个办法就行不通了
return (Subset((n-1),s-a[n])||Subset(n-1,s));//递归
}
int main(){
cin>>n>>s;
for(int i=0;i<n;i++)
cin>>a[i];
if(Subset(n,s))
cout<<"true"<<endl;
else
cout<<"false"<<endl;
return 0;
}