部分和问题

0-1部分和

  • 问题描述:有n个大小不同的数字a,判断是否能从中取出若干个数,使得这些数的和为k。
  • 解决思路:利用DFS(深度优先搜索)来解决,用dfs(i,j)表示前i个数字能否得到部分和j,则根据前i+1个数的能否得到部分和j或j+a[i+1]来判断dfs(i,j)的状态,算法如下:
1 bool dfs(int i,int sum)
2 {
3     if(i==n) return sum==k;
4     if(dfs(i+1,sum)) return true;
5     if(dfs(i+1,sum+a[i+1])) return true;
6     return false;
7 }

  或者也可以将此问题转化为0-1背包问题求解,第i件物品的重量和价值均为a[i],判断能否恰好将某些物品放入容量为k的背包中。

多重部分和

  • 问题描述:有n个大小不同的数字a,每个数有m个,判断能否从中取出若干个数,使得这些数的和为k。
  • 方法1:利用动态规划求解,dp[i][j]表示前i个数能否构成部分和j,时间复杂度为O(nkm)算法如下:
1 dp[n+1][k+1];
2 dp[0][0]=1;
3 
4 for(int i=0; i<n; i++)
5     for(int j=0; j<=k; j++)
6         for(int s=0; s<=m[i]&&s*a[i]<=j; s++)
7             dp[i+1][j] |= dp[i][j-s*a[i]];
  • 方法2:利用动态规划求解,dp[i][j]表示用前i个数得到部分和时,第i个数最多能剩余多少个,dp[i][j]被初始化为-1,dp[i][j]>-1表示前i个数能得到部分和j,算法的伪代码如下:
    if dp[i-1][j]>=0 dp[i][j]=m[i];
    else if(a[i]>j || dp[i][j-a[i]])<=0) dp[i][j]=-1;
    else dp[i][j]=dp[i][j-a[i]]-1;

    对以上算法可以优化空间复杂度,用cn[j]表示状态dp[i][j],则算法如下:

    1 memset(cn,-1,sizeof(cn));
    2 dp[0]=0;
    3 
    4 for(int i=0; i<n; i++)
    5     for(int j=0; j<=k; j++)
    6         if(dp[j]>=0) dp[j]=m[i];
    7         else if(j<a[i] || dp[j-a[i]]<=0) dp[j]=-1;
    8         else dp[j]=dp[j-a[i]]-1;

     

转载于:https://www.cnblogs.com/leeshine/p/4330298.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验 6 数组1

//输入n个整数&#xff0c;将它们存入数组a中。输出最大值和它所对应的下标。 #include<stdio.h> int main(void) {int n,i,x;int a[10];x0;printf("enter n:");scanf("%d",&n);for(i0;i<n;i){printf("enter :");scanf("%d&qu…

初中计算机职称答辩,晋升中学语文高级教师职称答辩内容举例

晋升中学语文高级教师职称答辩内容举例 晋升中学语文高级教师职称答辩秘籍 最重要的一点&#xff1a;你要对课本上的重点篇目非常熟悉&#xff01;对于现代文来说作者、题材、课文重点、重点句子词语、中心思想等你都要明了。对于文言文来说&#xff0c;要求学生掌握的&#xf…

SDM For Face Alignment流程介绍及Matlab代码实现之测试篇

测试很简单了&#xff0c;只需要载入数据&#xff0c;然后做正则化处理&#xff0c;使用训练模型产生的{Rk},就可以预测特征点了。 face_alignment.m:用来预测特征点 function shape face_alignment( ShapeModel, DataVariation,...LearnedCascadedModel, Data, img, shape,…

Flink – JobManager.submitJob

JobManager作为actor&#xff0c; case SubmitJob(jobGraph, listeningBehaviour) >val client sender()val jobInfo new JobInfo(client, listeningBehaviour, System.currentTimeMillis(),jobGraph.getSessionTimeout)submitJob(jobGraph, jobInfo) submitJob&#xff0…

window内容

window parent top location.href location.reload location.replace转载于:https://www.cnblogs.com/carlos-guo/p/3391784.html

计算机类公务员如何提升自己,大学毕业才发现:所学专业对考公务员如此重要,4类专业上岸率高...

导语&#xff1a;毕业季来临&#xff0c;同学们是想直接找工作积累工作经验&#xff0c;还是继续考取相关证书&#xff0c;来获得更稳定职业的入场券&#xff1f;毕业抉择很多毕业生面临的第一个问题就是未来职业规划&#xff0c;因为大学毕业之后&#xff0c;就意味着一段新的…

使用getline读入

直接上代码&#xff1a; 第一份&#xff1a;从cin 读入多行数字&#xff0c;每行2个。当输入完毕后&#xff0c;按2次回车结束 #include<iostream> #include <cstdio> #include <sstream> #include <string> #include <vector> #include <it…

POJ 1221

整数划分 划分成单峰的回文数列 dp[i][j] 表示 把i划分&#xff0c;其中划分的数不能大于j 1             i1或j1 dp[i][j]  dp[i][j-1]1         ji dp(i,j-1)dp(i-j,min(i-j,j)) i>j>1 1 #include <iostream>2 #include <cstd…

HYSBZ - 1050(旅行comf 并查集Java实现)

HYSBZ - 1050(旅行comf Java实现) 原题地址 解法&#xff1a;枚举每一条边&#xff0c;对于这条边&#xff0c;我们需要找到集合中和其值相差最小的最大边&#xff0c;这个集合是指与包括i边在内的ST联通集。对于这一要求&#xff0c;我们只需对所有的边进行从小到大的排序&…

UVA 11401 - Triangle Counting

Problem G Triangle Counting Input: Standard Input Output: Standard Output You are given n rods of length 1, 2…, n. You have to pick any 3 of them & build a triangle. How many distinct triangles can you make? Note that, two triangles will be considere…

苏州软件测试11k工资要什么水平,3个月从机械转行软件测试,他的入职薪资是11K...

原标题&#xff1a;3个月从机械转行软件测试&#xff0c;他的入职薪资是11K只要找到适合自己的学习方式&#xff0c;成功转行只是早晚的问题&#xff01;今天汇智妹给大家介绍的这位小伙伴&#xff0c;是咱们汇学联盟平台上的一位线上学员——小周。97年的小哥哥&#xff0c;19…

python idle 清屏问题的解决

在学习和使用python的过程中&#xff0c;少不了要与python idle打交道。但使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?我在stackoverflow看到这样两种答案&#xff1a;1.在shell中输入1 import os 2 os.system(cls) 这种方法只能在windows系统中cmd模式下的…

TCP/IP 原理--链路层

链路层作用&#xff1a; &#xff08;1&#xff09;为IP模块发送和接收IP数据报&#xff1b; &#xff08;2&#xff09;为ARP发送ARP请求和接受ARP应答 &#xff08;3&#xff09;为RARP发送RARP请求和接受ARP应答 协议&#xff1a;以太网和SLIP协议 A.以太网协议数据封装格式…

Sqoop拒绝连接错误

使用Sqoop远程连接MySQL导入数据到HBase数据库&#xff1a; sqoop import --driver com.mysql.jdbc.Driver --connect "jdbc:mysql://hzhiServer:3306/myssh?autoReconnecttrue" --table table_001 --username hadoop --password 1 --hbase-table table_001 --colum…

拆解凹多边形

偶遇需要拆解凹多边形 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Media;namespace DrawPolygon {public static class Settings{public const float…

计算机教学的弊端,信息技术在教学中的利弊及解决对策

摘 要&#xff1a;信息技术教育已成为国家信息化事业的重要组成部分&#xff0c;是当今素质教育的重要内容之一。从阐述信息技术教育的内涵和发展阶段出发&#xff0c;分析了当前信息技术在教学应用中的优势和存在的问题&#xff0c;并提出了相应的解决对策。关键词&#xff1a…

【转】Linux命令之查看文件占用空间大小-du,df

原文网址&#xff1a;http://blog.csdn.net/wangjunjun2008/article/details/19840671 du(disk usage),顾名思义,查看目录/文件占用空间大小#查看当前目录下的所有目录以及子目录的大小$ du -h $ du -ah #-h:用K、M、G的人性化形式显示 #-a:显示目录和文件 du -h tmp du -ah tm…

一个FORK的面试题

为什么80%的码农都做不了架构师&#xff1f;>>> #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i0; i<2; i){ fork(); printf("-"); } wait(NULL); wait(NULL); return 0; }/c 如果…

C++11系列学习之二-----lambda表达式

C11添加了一项名为lambda表达式的新功能&#xff0c;通过这项功能可以编写内嵌的匿名函数&#xff0c;而不必编写独立函数和函数对象&#xff0c;使得代码更容易理解。lambda表达式的语法如下所示&#xff1a;[capture_block](parameters) exceptions_specification -> retu…

php四种基础算法:冒泡,选择,插入和快速排序法

许多人都说 算法是程序的核心&#xff0c;一个程序的好于差,关键是这个程序算法的优劣。作为一个初级phper&#xff0c;虽然很少接触到算法方面的东西 。但是对于冒泡排序&#xff0c;插入排序&#xff0c;选择排序&#xff0c;快速排序四种基本算法&#xff0c;我想还是要掌握…