【动态规划】最长非降子序列 01背包 插入加号

简介: 1. 计算给定整数序列的最长非升子序列。2. 解决 0-1 背包问题,找出使总价值最大的物品组合。3. 找出在整数中插入加号的方法,使得加号后的整数和最小。

给定一个由n个正整数组成的序列,从该序列中删除若干个整数,使剩下的整数 构成非升子序列(即后面的项不大于前面的项),打印出最长的非升子序列。

#include<bits/stdc++.h>

using namespace std;

int main()

{

 int a[100]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

 int b[100]={0,48,16,45,47,52,46,36,28,46,69,14,42};

 a[1]=1;

 int lmax=0;

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

 {

   int max=0;

   for(int j=i-1;j>=1;j--)

   {

     if(b[i]>b[j])

     {

       if(a[j]>max)max=a[j];

     }

   }

   a[i]=max+1;

   if(a[i]>lmax)lmax=a[i];  

 }

 cout<<"最长非降子序列的长度为"<<lmax<<endl;

 for(int i=12;i>=1;i--)

 {

   if(a[i]==lmax)

   {

     cout<<b[i]<<",";

     lmax--;

   }

 }

 return 0;

}

已知n种物品和一个可以容纳重量c的背包,物品i的重量为wi,产生的效益为pi。在装包时物品i可以装入,也可以不装入,但不可拆开装。如何选择这n个物品,使总收益最大?

#include<bits/stdc++.h>

using namespace std;

int MAX(int a,int b)

{

 return a>b?a:b;

}

int main()

{

 int n=6;//n种物品

 int c=60;//可容纳重量为60的物品

 int w[7]={0,15,17,20,12,9,14};//每件物品的重量

 int p[7]={0,32,37,46,26,21,30};//每件物品的价值

 int a[100][100];//第一【】装了多少物品,第二个【】剩余多少容量,值产生的价值

 for(int i=1;i<=n;i++)//n为6

 {

   for(int j=1;j<=c;j++)//c为60

   {

     if(j>=w[i])//当前容量大于等于当前物品的容量(可以拿)

     {

      //可以拿的时候判断到底拿不拿

       a[i][j]=MAX(a[i-1][j],a[i-1][j-w[i]]+p[i]);

     }

     else//当前容量小于当前物品的容量(不能拿)

     {

       a[i][j]=a[i-1][j];

     }

   }

 }

 cout<<"背包能装的最大价值为:"<<a[n][c];

 return 0;

}

在一个n位整数a中插入r个加号,将它分成r+1个整数,找出一种加号的插入方法,使得这r+1个整数的和最小

#include<bits/stdc++.h>

using namespace std;

int sub(int number[],int start,int end);

int main()

{

 char character[100];

 int number[100];

 int addnumber;

 int f[100][100];

 cout<<"请输入整数:";

 cin>>character;

 cout<<"请输入+号的个数:";

 cin>>addnumber;

 int length=strlen(character);

 

//将字符型转化为数字型

 for(int i=0;i<length;i++)

 {

   number[i]=character[i]-48;

 }

 

//赋初值

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

 {

   f[i][0]=sub(number,0,i);

 }

 

 

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

 {

   for(int j=i+1;j<=length;j++)

   {

     int min=99999999;

     for(int k=i;k<j;k++)

           {  

               int value=f[k][i-1]+sub(number,k,j);

               if(value<min)  

               {  

                   min=value;  

               }  

           }

     f[j][i]=min;  

   }

 }

 cout<<"最小值为:"<<f[length][addnumber];

 return 0;

}

int sub(int number[],int start,int end)

{

 int count=0;

 for(int i=start;i<end;i++)

 {

   count=count*10+number[i];

 }

 return count;

}

目录
相关文章
|
XML IDE C++
REDHAWK——连接(续)(一)
REDHAWK——连接(续)(一)
233 0
|
存储 运维 监控
阿里云的文件存储NAS使用心得
阿里云的文件存储NAS使用心得
705 0
|
存储 人工智能 算法
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
1001 0
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
516 2
|
数据采集 算法 数据挖掘
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
LinkedIn 对全球超过3.3亿用户的工作经历和技能进行分析后得出,目前最炙手可热的25 项技能中,数据挖掘排名第一。那么数据挖掘是什么? 数据挖掘是从大量数据(包括文本)中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此“数据挖掘”已成为企业保持竞争力的必要方法。 今天给小伙伴们分享的Python数据分析与数据挖掘手册是10余位数据挖掘领域资深专家和科研人员,10余年大数据挖掘咨询与实施经验结晶。从数据挖掘的应用出发,以电力、
437 13
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
前端开发
类抖音logo的光影之旅:CSS动画效果,让标志更具吸引力!
类抖音logo的光影之旅:CSS动画效果,让标志更具吸引力!
|
API Python Windows
将Py转为exe文件
今天我要给大家介绍一种非常方便的方法,可以将Python文件打包成可执行的exe文件。你不用担心用户是否安装了Python环境,只需要一个点击,你的程序就能在任何Windows电脑上运行了!,当然在进行文件打包时,我们总会遇到很多问题,例如某模块未打包进入文件,导致exe文件无法使用,接下来,我会一点一点进行解决.此工具我会出一个专栏,这是工具1.0版本的,只能打包,只包含基础库的py文件,后续会一步步优化,包含自定义打包文件的小图标,文件名,将音乐或其他第三方库模块进行打包。注意,最终为一个GUI工具
将Py转为exe文件
|
JavaScript 前端开发 定位技术
OpenLayers入门(一)
OpenLayers入门(一)
1727 0
OpenLayers入门(一)
|
自然语言处理 图形学
【unity实战】一个通用的FPS枪支不同武器射击控制脚本
【unity实战】一个通用的FPS枪支不同武器射击控制脚本
954 0