将数组分为三部分(递归)
Divide an array into Three parts (Recursion)
问题链接:
https://www.hackerearth.com/problem/algorithm/divide-to-three-33/description/
我能够使用动态编程来解决它。https://www.hackerearth.com/submission/1720148/
有人可以解释我的编辑解决方案(递归)。
编辑解决方案:
#include<cstdio>
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
#include<fstream>
#include<sstream>
using namespace std;
typedef long long int int64;
int64 n,a[40],ans,vl;
void fn(int64 i,int64 j,int64 k,int64 ptr){
if(ptr==n){
vl = max(max(i,j),k);if(vl<ans)ans=vl;
}
else{
fn(i+a[ptr],j,k,ptr+1);
fn(i,j+a[ptr],k,ptr+1);
fn(i,j,k+a[ptr],ptr+1);
}
}
int main(){
//freopen("in3.txt","r",stdin);
//freopen("out3.txt","w",stdout);
int64 i,j,k,l,m,t,vl,fl;ans=1000000;
cin>>n;for(i=0;i<n;i++)cin>>a[i];
fn(0,0,0,0);
printf("%lldn",ans);
return 0;
}
谢谢
Idea 非常简单,您可以将元素添加到三个集合(S1 或 S2 或 S3)中的任何一个。fn
使用该功能,编码器基本上就是这样做的。查找一个表示为 ny ptr
(元素为 a[ptr]
) 的元素,它要么被添加到 first( i
),second( j
) 或 last( k
)。其中最大值作为输出给出。
实际上,将元素添加到三个集合中的任何一个的所有可能性都通过这三行进行检查
fn(i+a[ptr],j,k,ptr+1);
fn(i,j+a[ptr],k,ptr+1);
fn(i,j,k+a[ptr],ptr+1);
基本条件显然是当我们完成检查数组中的所有 elemet 时
if(ptr==n){
vl = max(max(i,j),k);if(vl<ans)ans=vl;
}
在
max(max(i,j),k)
中找到最多三个集合和。现在
if(vl<min)
将确定满足条件的最低S1
。这就是为什么这个检查是v1<ans
,我们将尽量减少S1
。这里的 i,j,k 表示相应集合的总和。
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 三重限制的正整数组合的非递归枚举
- 改进了三递归函数
- 将三个嵌套的 for 循环包装成递归
- 具有三个参数的C 递归二进制搜索
- 将数组分为三部分(递归)
- 通过递归 - c++ 将排序的两个链表合并到第三个链表中
- c++ switch语句在三次递归运行后恢复为默认语句