【编程测试题】数字和为sum的方法数

编程题——和为sum的方法数 题目描述 给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。 当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。 输入描述: 输入为两行: 第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000) 第二行为n个正整数A[i](32位整数),以空格隔开。 输出描述: 输出所求的方案数 阅读详情

题目描述

给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。

输入描述:

输入为两行:
 第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)
 第二行为n个正整数A[i](32位整数),以空格隔开。

输出描述:

输出所求的方案数

// 刚开始是用递归写的,说实话递归即好想有好写。但是毕竟时间复杂度是O(n^n),
// 运行完后50%超时。然后想到了动态规划。但是吧,不知道怎样规划这个很恼人,
// 最后在评论区找到思路然后开始写代码。
//------------------------------------------------------------------------------------------------------
// 我这里的思路以示例为例,然后我把图标放在了下面,纵坐标除了第一个外是输
// 入;横坐标是从0-sum的所有值。数组内格子含义是该行最左侧数字(即输入)
// 与之前的数字能得到该列数字的最多的可能性:

// 然后说一下做法:
// 1.由于每个数总能把0填上,且0不可填上初0外其余数,所以数组第一行全填0,第
// 一列全填1;
// 2.从第二行第二列开始遍历数组。如果列所在数字减去该行数小于0,那么该格子继
// 承本列上一行的数字。例如图中(2,10)对应格子。由于让10得到2,那必须由-8+5得
// 到,但是该题无法得到比0小的数,因此由10之前的数得到2的最多可能与他之前的
// 数(即5)是一样的;
// 3.如果列所在数字减去该行数大于等于0,该格子内容为该列上一行数字与上一行差
// 值所在格子数量和。什么意思呢?例如(10,3),若想要用3之前的数列得到10,除了
// 它上一行(即2)本身就能得到2个10外,只要之前的数字是7,7+3依然可以得到10。因
// 此去看上一行中列数为7的格子数值,为2,即它上一个数有2中组合得到7,7+3=10。
// 那该行数值即为2+2=4。
// 代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
    int n, sum;
    cin >> n >> sum;
    vector<long> tmp(sum + 1, 0), input(n + 1, 0);
    tmp[0] = 1, input[0] = 0;
    vector<vector<long> >dp(n + 1, tmp);
    for (int i = 1; i <= n; i++) cin >> input[i];
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= sum; j++)
        {
            if (j - input[i] >= 0) dp[i][j] = dp[i - 1][j] + dp[i - 1][j - input[i]]; //这个就如解析力写的一样
            else dp[i][j] = dp[i - 1][j]; //否则直接继承该列上一行值
        }
    }
    cout << dp[n][sum] << endl;  //输出最后一个
    return 0;
}

有点看不懂动态规划的就很烦!!~~


用动态规划,类似01背包问题,f(i , j )表示前i 个数中和为 j 的方案数, 则 若 j >= a[i],  f ( i ,j) = f(i -1, j)+ f (i - 1,j - a[i] );

否则,  f ( i ,j) = f(i -1, j)。

可优化地方:由于二维数组中,第i行 只与第 i - 1 行有关,所有我们若从 最后一列 开始更新数组,则可用一维数组来保存先前状态。

时间复杂度为:O( n * sum ) 。

#include<iostream>
#include<vector>
using namespace std;
 
int main() {
    int n, sum;
    cin>>n>>sum;
    
    vector<long long> a(sum+1);
    vector<int> b(n);
    
    for(int i=0; i<n; i++)
        cin>>b[i];
    
    a[0] = 1;
    
    for (int i=0; i<n; i++)
        for (int j=sum; j>=b[i]; j--)
          	a[j] += a[j-b[i]];
    
    
    cout<<a[sum]<<endl;
    
    return 0;
    
}


 

嵩天老师《Python语言程序设计》第4周测试题笔记 在知乎上听说嵩天老师的Python课程适合小白,于是从知乎转至慕课,目前正在学习此门课程。接下来的测试题留以自己复习使用,也供大家进行学习。练习题平时还可以在python123上面继续练习,就不在这里附内容了。 (Ps:感觉自己是个渣渣,需要多学多看多编代码) 一、单项选择题 for var in __: print (var) 哪个选项不符合上述程序空白处的语法要求?【{1;2;3;4;5}】 2. for i in range (0:2): print (i) 哪个选项是以上程 阅读详情

相关推荐

给定一个整数n,求出所有连续的且和为n正整数

给定一个整数n,求出所有连续的且和为n正整数。比如对于整数27,结果为2~7、8~10、13和14,因为这些数之间的整数的和都是27。注意:并不是所有的整数都有结果,例如不存在连续的整数和为16。为了提高计算的效率,程序所采用的算法如下:(1) 从1开始计算连续的整数和sum,直到sum不小于n为止;(2) 在第i步,如果sum=i+(i+1)+…+j比n大,则去掉连加的最左端的数i,如果sum比n小,在连加的右端加上一个数(j+1);(3) 如果和sum=i+(i+1)+…+j等于n,则i+(i+1)+…+j为一组解,输出该解,并将连加的右端加上(j+1);(4) 重复2,3步,直到i大于n/2为止。

Java编程题:数字和为sum的方法数(动态规划——背包问题)

数字和为sum的方法数 给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。 输入描述: 输入为两行: 第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000) 第二行为n个正整数Ai,以空格隔开。 输出描述: 输出所求的方案数 示例1 输入 5 15 5 5 10...

长不大的大灰狼 1128

( 滴滴出行2017秋招笔试真题-编程题汇总.pdf )

( 滴滴出行2017秋招笔试真题-编程题汇总.pdf ) ( 滴滴出行2017秋招笔试真题-编程题汇总.pdf ) ( 滴滴出行2017秋招笔试真题-编程题汇总.pdf )

数字和为sum的方法数

数字和为sum的方法数

m0_46613341的博客 242

sum函数、fib函数、taylor函数

sum函数计算1+2+…+n的值;fib函数计算Fibonacci数列前n项和;taylor函数计算题目中式子的值。

判断输入的任何一个正整数n,是否等于某个连续正整数序列之和。

计算机编程题目:判断输入的任何一个正整数n,是否等于某个连续正整数序列之和。(要求多次输入直到碰到输入的数字小于1时程序退出。) C++语言编写的代码

数字和为sum的方法数--牛客

给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。 当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。 输入描述: 输入为两行: 第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000) 第二行为n个正整数A[i](32位整数),以空格隔开。 输出描述:出所求的方案数 示例1 输入 5 15 5 5 10 ...

be_gin_ner的博客 565

AD域控设置客户端桌面壁纸

此时再右键wallpaper文件夹,共享选项下的网络路径已经有了。找到该域下的组策略编辑器(第一步有)并按照图下所示找到桌面壁纸的策略设置,点击进去。在高级共享里可以设置共享名和同时共享的用户数量限制。点击下拉箭头,找到Everyone并选择,点击添加后,点击共享。然后可以看到刚才的新建文件夹策略在域控服务器和客户端都生效了。右键wallpaper文件夹->属性,点击共享选项,点击共享。在弹出的窗口里,按照图下所示设置,点击应用并且确认。在弹出的窗口里,按图示找到文件夹,右键新建文件夹。

欲买桂花同载酒的博客 6054

【算法】给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数(C++源码)

问题描述 给定一个有n个正整数的数组a和一个整数sum,求选择数组a中部分数字和为sum的方案数。若两种选取方案有一个数字的下标不一样,则认为是不同的方案。 输入描述 输入为两行,第1行为两个正整数n和sum,第2行为n个正整数,以空格隔开。 输出描述 输出所求的方案数。 样例 5 15 5 5 10 2 3 输出 4 步骤描述 动态规划问题,构建一个dp二维数组,将第一行第一列全部置零,再将dp[0][0]=1;上下传值,并判断若满足给定的约束条件,则累加。最后输出右下角元素。 运行结果截图 源代码(C

敲代码两年半的练习生博客 3653

python爬取《你好, 李焕英》豆瓣评论数据

# 导入工具包 import requests from bs4 import BeautifulSoup import time import pandas as pd import numpy as np # 请求头 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'} # =

python技巧分享 3456

ROS应用之如何配置RTOS满足机器人系统中的实时要求

实时操作系统(RTOS)基本概念实时操作系统(RTOS)是设计用于实时应用的操作系统,其主要目标是在确定的时间内完成任务。RTOS的任务调度算法和优先级控制机制能够确保高优先级任务按时完成。精确的传感器数据采集:传感器数据需要在规定时间内采集并传输给控制系统。快速响应外部事件:对于控制系统,需要确保指令在最短的时间内得到响应。任务的调度周期:任务的周期可以通过公式计算,其中 ftask 是任务的调度频率。优先级分配。

weixin_68094467的博客 1008

Python学习 DAY 15 Python测试题

DAY 15 Python测试题 (一)填空题 1.list(map(str, [1, 2, 3]))的执行结果为 ['1', '2', '3'] map() 会根据提供的函数对指定序列做映射 2.语句x = 3==3, 5执行结束后,变量x的值为 True,5 3.已知 x = 3,并且id(x)的返回值为 496103280,那么执行语句 x += 6 之后,表达式 id(x) == 496103280 的值为 3 +号操作对可变对象和不可变对象都会改变id,+=号操作改变不可变对象id,不改变可

weixin_44376037的博客 7546

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1731

第一与第二次测试题总结

lst.append([4, 5]):append() 方法将整个列表 [4, 5] 作为单个元素添加到原列表末尾,此时 lst 变为 [1, 2, 3, [4, 5]],lst.extend([6, 7]):extend() 方法将列表 [6, 7] 添加到原列表末尾,此时 lst 变为 [1, 2, 3, [4, 5], 6, 7],lst.insert(8, 9):insert(index, value) 在指定位置处插入元素。i=1 时,nums[1]=3 是奇数,i 变为 2;

2401_89673213的博客 863

CRISPR筛选全流程指南:从文库构建到数据分析实战

功能基因组学研究需要高效解析基因型与表型的关联,高通量筛选技术是其中的关键工具。基于CRISPR系统的筛选方法通过大规模sgRNA文库扰动基因功能,结合慢病毒递送和测序分析,能够系统鉴定影响细胞增殖、耐药、病毒感染的候选基因。与RNAi或化学小分子筛选相比,CRISPR筛选具有覆盖全基因组、脱靶率低、信号清晰等优势,已广泛应用于药物靶点发现、合成致死和免疫治疗机制研究。本文围绕实验设计与操作中的核心要点展开,涵盖文库扩增、病毒滴度控制、MOI把握、筛选模式选择以及基于MAGeCK的sgRNA丰度分析,并针对

weixin_31188927的博客 282

STM32F103 实例应用(10)——I2C读写24C32

一、应用简介 本文介绍24C32的读写,基于野火的软件I2C程序。 board_i2c.h /**=========================================================================== @file board_i2c.h @brief 本文件是用于I2C驱动 @author 青梅煮久 @version r0.1 @date 2021/01/13 -------------------------.

qq_34118600的博客 3447

C语言模拟测试题~THREE

五、编程题(共3小题,共26分) 1.编程实现:输入整数a和b,若a2+b2大于100,则输出a2+b2十位以上的数字,否则输出两数之和。例如输入8,9,则输出14,输入4,6,则输出10(6分)。 #include <stdio.h> #include <math.h> int main(){ int judge(int a,int b); int a,b; printf("请输入两个整数:"); scanf("%d %...

hey,欢迎浏览我的博客,希望能给你提供帮助。 507

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 223

Python 第一阶段测试题 答案及解析

本文是一份Python基础测试题解析,包含23道题目,涵盖循环结构、列表操作、函数、递归、变量作用域、数据类型转换等知识点。通过多选题、单选题和判断题的形式,考察了Python编程中的常见概念和易错点,如偶数求和的实现方法、列表切片操作、递归函数终止条件、全局/局部变量区别等。每道题目均配有详细解析,说明正确答案及原因,有助于学习者理解Python基础语法和逻辑。文章适合Python初学者检验基础知识掌握程度,并加深对核心概念的理解。

Y_P_W的博客 1587

【报错解决】OpenClaw 报错 `openclaw: command not found`:全局命令未加入系统 PATH 的深度排查与修复指南

在国产AI工具链开发中,OpenClaw作为关键命令行工具常出现command not found报错。本文深度分析该问题的根源——Linux环境变量PATH未包含用户级安装目录(~/.local/bin)。通过四种解决方案(临时PATH修改、永久配置、软链接、虚拟环境处理)和排错Checklist,揭示"命令存在却找不到"的本质是路径配置问题,特别适用于Docker/国产Linux/非root环境。文中强调理解Linux工具链机制对国产AI开发的重要性,并指出这是开发者掌握环境

博客 5382

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Go C画图 CSP-J CSP-S NOIP 信息学奥赛 2023.01.17 测试题

Go C画图 CSP-J CSP-S NOIP 信息学奥赛 2023.01.17 测试题

青少年趣味编程 480

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java课后测试题

1、实验楼Linux中可以通过(ABC)查看用户登录情况。 A .who B .who am i C .who mom likes D .who are you 2、在 Linux 里面如何知道自己属于哪些用户组呢?(A) A .使用 groups 命令 B .addgroups C .查看 /etc/group 文件 D .lsgroups 3、表达式15&240的值为(B) A .FF...

cxyzc的博客 3996

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Python测试题1

C:int('abc', 11)中,11 进制的有效字符范围是 0-10(对应 'a'),而'b'在 11 进制中代表 11,超出基数范围(基数为 11 时,最大数字为 10),实际会触发ValueError: invalid literal for int() with base 11: 'abc',产生异常。func(3) = func(2) + [3],func(2) = func(1) + [2],func(1) = func(0) + [1],func(0) = [],最终结果[1,2,3]。

H_z_q2401的博客 1518

[蓝桥杯]测试题 H 算法训练 寂寞的数(C++示例代码)

蓝桥杯测试题 H 算法训练 寂寞的数 时间限制:1.0s 内存限制:256.0MB 问题描述   道德经曰:一生二,二生三,三生万物。   对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。   因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n))...

weixin_43143173的博客 433

计算机技能测试题九,计算机技能测试题九.doc

计算机技能测试题九计算机技能测试题九班级 姓名 学号 成绩填写单选题答案1234567891011121314151617181920第一部分 笔试题(30分)单项选择题1、微型计算机中,ROM是()A、顺序存储器 B、只读存储器C、随机存储器D、高速缓冲存储器2、数字字符“1”的ASCII码的十进制表示为49,那么数字字符“8”的ASCII码的十进制表示为(...

weixin_35702486的博客 484

编程测试题

题1.企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 请分别用if判断和列表 分别完成上述题目 题2.给你一个数组 n.

qq_37648548的博客 963
上一篇: 【编程测试题】数字游戏
下一篇: 【编程测试题】连续最大和
HelloZEX
博客等级 码龄11年 486粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值