51nod1007(01背包)

本文介绍了一种使用01背包算法解决将数组分为两部分的问题,并详细解释了算法原理及其实现过程。通过两次优化,降低了空间复杂度。

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1007

 

题意:中文题诶~

 

思路:尽量将一个数组分成两个相等的部分,就是从原数组中选出一些元素使其和尽量接近所有元素的和的一半啦.至于如何选元素,我们可以用01背包解决;

假设原数组所有元素和为sum,那么可以分为 ans1 >= sum/2 和 ans2 <= sum/2 两部分,为了方便我们求 ans2 <=sum/2那部分, 那么此题的答案即为  sum-2*ans2,

接下来我们只要考虑如何用01背包求ans2就好啦;

我们用 dp[i][j] 表示到地 i 个元素为止,选择的元素和小于等于 j 的最大值,那么有 ans2=dp[n][num/2];

状态转移方程式为:

dp[i][j] = max (dp[i-1][j], dp[i-1][j-a[i]]+a[i]) 前者为不选当前元素,后者为选当前元素.注意后者状态的转变,最接近 j-a[i] 的那个数加上 a[i] 自然就是最接近 j 的数啦.

 

代码:

#include <bits/stdc++.h>
#define MAXN 110
using namespace std;

int a[MAXN], dp[MAXN][MAXN*MAXN]; //dp[i][j]存储的到地i个元素为止,可以得到的小于等于j的最大值

int main(void){
    int n, sum=0;
    cin >> n;
    for(int i=1; i<=n; i++){
        cin >> a[i];
        sum+=a[i];
    }
    for(int i=1; i<=n; i++){
        for(int j=sum/2; j>=a[i]; j--){
            dp[i][j]=max(dp[i-1][j], dp[i-1][j-a[i]]+a[i]);//选或不选a[i]
        }
    }
    cout << sum-2*dp[n][sum/2] << endl;
    return 0;
}

 

上述算法的时间复杂度和空间复杂度分别为:O(sum*n), O(sum*n);

我们可以进一步优化一下空间复杂度,通过上面的代码我们不难发现 dp[i][j] 都是由 dp[i-1][j] 得到的,也就是我们是直接由前一步的答案得到后一步结果的,直至得到最终答案.那么我们可以不存储前面的数据.用 dp[j]存储当前能得到的小于等于 j 的最大值,然后逐步更新dp[j]的值就可以得到答案啦;

其空间复杂度为 O(sum)

 

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 110
 3 using namespace std;
 4 
 5 int a[MAXN], dp[MAXN*MAXN]; //dp[j]存储可以得到的小于等于j的最大值
 6 
 7 int main(void){
 8     int n, sum=0;
 9     cin >> n;
10     for(int i=0; i<n; i++){
11         cin >> a[i];
12         sum+=a[i];
13     }
14     for(int i=0; i<n; i++){ //外循环通过选中a[i]来更新dp[j]的值
15         for(int j=sum/2; j>=a[i]; j--){
16             dp[j]=max(dp[j], dp[j-a[i]]+a[i]);
17         }
18     }
19     cout << sum-2*dp[sum/2] << endl;
20     return 0;
21 }

 

转载于:https://www.cnblogs.com/geloutingyu/p/6279279.html

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值