当前位置: 首页 > 滚动 > >正文

洛谷P8646题解

来源:哔哩哔哩    时间:2023-05-21 21:59:33

题目描述:


(相关资料图)

给定 n 个非负整数 a[1],a[2],…,a[n],你需要选出若干个数使得它们的和最大,同时满足相邻的两个数不能同时被选中。

解题思路:

这是一道比较经典的动态规划问题,可以使用类似于背包问题的思路进行解决。具体来说,我们设 f[i] 表示前 i 个数中的最大值,且第 i 个数必须被选中的情况下的最大和,g[i] 表示前 i 个数中的最大值,且第 i 个数没有被选中的情况下的最大和。则有以下状态转移方程:

f[i]=g[i-1]+a[i]

g[i]=max(g[i-1],f[i-1]

其中 f[i] 表示第 i 个数被选中的情况,而 g[i] 表示第 i 个数不被选中的情况。最终所求答案即为 max(f[n],g[n])。

代码:

#include <bits/stdc++.h>

using namespace std;

int n,A[105];

bool dp[10005];

void init()

{

dp[0]=true; 

for(int i=1;i<=n;i++)

for(int j=0;j+A[i]<=10000;j++)

if(dp[j]) dp[j+A[i]]=true;//动态规划 

}

int main()

{

scanf("%d",&n);

for(int i=1;i<=n;i++)

scanf("%d",&A[i]);

int GCD=A[1];

for(int i=2;i<=n;i++)

GCD=__gcd(GCD,A[i]);//求出最大公因数 

if(GCD>1)//特判 

{

cout<<"INF"; 

return 0;

}

init();

int ans=0;

for(int i=1;i<=10000;i++)

if(!dp[i]) ans++;//动态规划 

printf("%d",ans);

return 0;

}

X 关闭

推荐内容

最近更新

Copyright ©  2015-2022 华南珠宝网版权所有  备案号:粤ICP备18025786号-52   联系邮箱: 954 29 18 82 @qq.com