动态规划入门第3课,经典DP问题2 --- 背包问题

news2024/11/26 14:53:22

 

  • 练习1
第1题     方案数 查看测评数据信息

给你n个整数,每个数可选或不选,要求选一些数,使它们的和为S,问有多少种方案?

输入格式

  第一行:2个整数n和s,范围都在[1, 100]。

  第二行:n个整数,每个数范围在[-100, 100]。

输出格式

输出方案数。(答案不超过2^63)

输入/输出例子1

输入:

6 10

3 4 7 8 -1 2 

输出:

  4

样例解释:

  3+7, 3+8-1, 4+7-1, 8+2

样例解释

代码奉上

#include<bits/stdc++.h>
using namespace std;
int n,s,d[10011];
long long f[10001];
int main(){
    cin>>n>>s;
    for(int i = 1;i <= n;i++){
        cin>>d[i];
    }
    sort(d+1,d+n+1);
    int m=n+1;
    for(int i = 1;i <= n;i++){
        if(d[i]>= 0){
            m = i;
            break;
        }
    }
    f[0] = 1;
    for(int i = m;i <= n;i++){
        for(int j = 10000;j >= 0;j--){
            if(f[j] != 0&&(j+d[i]<= 10000)){
                f[j+d[i]]+=f[j];
            }
        }
    }
    for(int i = 1;i < m;i++){
        for(int j = 0;j <=10000;j++){
            if(f[j] != 0&&(j+d[i]>= 0)){
                f[j+d[i]]+=f[j];
            }
        }
    }
    cout<<f[s];
    return 0;
}

第2题     差距最小 查看测评数据信息

给你n个正整数,要求你分成2堆,使它们各自的和尽量相同。问2堆的差距最小是多少?

输入格式

 第一行:1个整数n,范围都在[1, 1000]。

  第二行:n个整数,每个数范围在[1, 100]。

输出格式

输出最小差距。

输入/输出例子1

输入:

  6

  3 4 7 8 1 2 

输出:

  1

样例解释:

  13=3+7+1+2

  12=4+8

样例解释

代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int MAX_N = 1005;
const int MAX_SUM = 50005;

int main() {
    int n;
    cin >> n;

    vector<int> nums(n);
    int sum = 0;

    for (int i = 0; i < n; i++) {
        cin >> nums[i];
        sum += nums[i];
    }

    int half_sum = sum / 2; 
    vector<bool> dp(MAX_SUM, false);  
    dp[0] = true;  

    for (int i = 0; i < n; i++) {
        for (int j = half_sum; j >= nums[i]; j--) {
            if (dp[j - nums[i]]) {
                dp[j] = true;  
            }
        }
    }

    int min_diff = sum;  
    for (int j = half_sum; j >= 0; j--) {
        if (dp[j]) {
            min_diff = sum - 2 * j;  
            break;
        }
    }

    cout << min_diff << endl;

    return 0;
}

第3题     打印方案 查看测评数据信息

给你n个正整数,每个数可选或不选,要求选一些数,使它们的和为S,输出任意一种方案。

输入格式

  第一行:2个整数n和s,范围都在[1, 10000]。

  第二行:n个整数,每个数范围在[1, 1000]。

输出格式

输出任意一种方案。如果没有方案,输出-1。

输入/输出例子1

输入:

 6 110

  30 50 100 70 30 40

 

输出:

  30 50 30

样例解释:

  或者 70 40也可以。

样例解释

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a,s;
long long fa[1000005],b[1000005];
int main()
{
    cin>>n>>s;
    b[0]=1;
    for(int i=1;i<=n;i++){
        cin>>a;
        if(a>s)continue;
        for(int j=s;j>=0;j--)
        {
            if(b[j]!=0&&!fa[j+a])
            {
                b[j+a]++;
                fa[j+a]=a;
            }
        }
    }
    if(b[s]==0)
    {
        cout<<-1;
        return 0;
    }
    while(s!=0)
    {
        cout<<fa[s]<<" ";
        s-=fa[s];
    }
    return 0;
}

 

  • 练习2
第1题     储钱罐 查看测评数据信息

给出储钱罐的重量,每种钱对应的重量和价值,求出储钱罐内至少有多少钱?                    

输入格式

  第一行为一个正整数T,表示T(T<=5)组测试数据。

每组数据:

第一行为两个正整数E,F(1<=E<=F<=10000),表示空的储钱罐的重量和装了钱后的重量。

第二行为一个正整数N(1<=N<=500),表示钱的种类数。

接着的N行每一行有两个正整数P,W(1<=P<=50000, 1<=W<=10000),表示钱的价值与重量。

输出格式

每组测试数据一行一个句子“The minimum amount of money in the piggy-bank is X.”X为至少有多少钱,如果无解,则输出“This is impossible.”(注意有英文句号)

 

输入/输出例子1

输入:

3

10 110

2

1 1

30 50

10 110

2

1 1

50 30

1 6

2

10 3

20 4

输出:

The minimum amount of money in the piggy-bank is 60.

The minimum amount of money in the piggy-bank is 100.

This is impossible.

样例解释

代码

#include <iostream>
#include <vector>
#include <limits>

int findMinimumAmount(int E, int F, int N, std::vector<std::pair<int, int> >& coins) {
    std::vector<int> dp(F + 1, std::numeric_limits<int>::max());
    
    dp[0] = 0;
    for (int j = 0; j < N; j++) {
    	for (int i = 1; i <= F; i++) {
            if (i >= coins[j].second && dp[i - coins[j].second] != std::numeric_limits<int>::max()) {
                dp[i] = std::min(dp[i], dp[i - coins[j].second] + coins[j].first);
            }
        }
    }
    
    return (dp[F-E] != std::numeric_limits<int>::max()) ? dp[F-E] : -1;
}

int main() {
    int T;
    std::cin >> T;
    
    while (T--) {
        int E, F;
        std::cin >> E >> F;
        
        int N;
        std::cin >> N;
        
        std::vector<std::pair<int, int> > coins(N);
        
        for (int i = 0; i < N; i++) {
            std::cin >> coins[i].first >> coins[i].second;
        }
        
        int result = findMinimumAmount(E, F, N, coins);
        
        if (result != -1) {
            std::cout << "The minimum amount of money in the piggy-bank is " << result << "." << std::endl;
        } else {
            std::cout << "This is impossible." << std::endl;
        }
    }
    
    return 0;
}

 

  • 练习3 
第1题     多重背包 查看测评数据信息

给出N种钱币的面值和每种钱币的个数,问要凑出M的钱最少要用多少枚钱币?

例如:N=4,M=40,钱币面值分别为:3,6,8,9 , 个数分别是:10,10,2,1。

答案为:6。

输入格式

  第一行:2个整数N和M,N范围在[1,50],M范围在[1,1000000]。

第二行:N个整数表示每种钱币的面值,每个数范围在[1,100]。

第三行:N个整数表示每种钱币的数量,每个数范围在[1,100000]。

输出格式

  输出最少钱币数。  输出最少钱币数。如果没有方案,输出-1。

输入/输出例子1

输入:

  2 100

  5 8

  20 6

输出:

  17

样例解释

代码:

#include<bits/stdc++.h>
using namespace std;
int N,M,d[510],c[510],ans = 0;
int nn,dd[10000],cc[10000];
int f[10000006];
int main(){
    cin>>N>>M;
    for(int i = 1;i <= N;i++){
        cin>>d[i];
    }
    for(int i = 1;i <= N;i++){
        cin>>c[i];
        if(c[i]>M/d[i]){
            c[i] = M/d[i];
        }
    }
    nn = 0;
    for(int i = 1;i <= N;i++){
        int x = c[i];
        for(int p2 = 1;x > p2;p2*=2){
            dd[++nn] = p2*d[i];
            cc[nn] = p2;
            x -= p2;
        }
        if(x > 0){
            dd[++nn] = x*d[i];
            cc[nn] = x;
        }
    }
    f[0] = 1;
    for(int i = 1;i <= nn;i++){
        for(int j = M-dd[i];j >= 0;j--){
            if(f[j]>0){
                if(f[j+dd[i]] == 0|| f[j+dd[i]]>f[j]+cc[i]){
                    f[j+dd[i]] = f[j]+cc[i];
                }
            }
        }
    }
    ans = f[M]-1;
    cout<<ans;
    return 0;
}

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

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

相关文章

spring boot3 集成swagger3

快速开始 | Knife14j 官方的推荐 1. 设置pom.xml 主要是引入nexus-maven&#xff0c;com.github.xiaoymin 2个&#xff0c;cn.hutool&#xff0c;org.springframework <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://ma…

Linux超详细的了解

文章目录 前言Linux的简介不同应用领域的主流操作系统Linux系统历史Linux系统各版本 Linux的安装安装方式介绍安装Linux网卡设置安装SSH连接工具finalShell连接虚拟机Linux和Windows目录结构对比Linux目录介绍 Linux常用命令Linux命令初体验文件目录命令ls命令cd命令cat命令mor…

【Hammerstein模型的级联】快速估计构成一连串哈默斯坦模型的结构元素研究(Matlab代码实现)

&#x1f4a5;1 概述 在许多振动应用中&#xff0c;所研究的系统略微非线性。Hammerstein模型的级联可以方便地描述这样的系统。Hammerstein提供了一种基于指数正弦扫描相位属性的简单方法。 构成一连串Hammerstein模型的结构元素可以在快速估计中起到关键的作用。Hammerstei…

260. 只出现一次的数字 III

题目描述&#xff1a; 主要思路&#xff1a; 首先通过抑或的方式可以将所有两个的数字全部排除&#xff0c;得到两个单个数字的异或值。 接下来将当前得到的异或值取最低一位的1。 分析异或值的每一位&#xff0c;为1的肯定是两个数中一个有一个没有。于是可以通过这一特性将两…

(转载)PID神经元网络解耦控制算法(matlab实现)

​本博客的完整代码获取&#xff1a;https://www.mathworks.com/academia/books/book106283.html​ 1案例背景 1.1PID 神经元网络结构 PID神经元网络从结构上可以分为输人层、隐含层和输出层三层&#xff0c;n个控制量的PID神经元网络包含n个并列的相同子网络,各子网络间既相…

【车载开发系列】AUTOSAR DemComponent和DemDTC

【车载开发系列】AUTOSAR DemComponent和DemDTC 【车载开发系列】AUTOSAR DemComponent和DemDTC 【车载开发系列】AUTOSAR DemComponent和DemDTC一. DemComponent概念二. DemDTC概念三. 常用设置参数DemDTCClass1&#xff09; DemDTCFunctional2&#xff09;DemDTCSeverity3&am…

正点原子ubuntu虚拟机 使用QT虚拟键盘

目录 下载源码使用QT creator 编译移植库文件 http://t.csdn.cn/3QWOj https://blog.csdn.net/LuoLewin/article/details/124283314 本文参考这篇文章&#xff0c;使用正点原子的Ubuntu虚拟机&#xff0c;成功实现QT虚拟键盘&#xff0c;其中使用的方法做下记录&#xff0c;以免…

在Goland上配置GO环境

基本可以参照&#xff1a;https://segmentfault.com/a/1190000023710741 几点说明&#xff1a; 如果项目中有mod文件&#xff0c;然后提示&#xff1a;$GOPATH/go.mod exists but should not,可以如下操作&#xff1a; 设置进入到这个页面&#xff1a; 如何要安装一些包&…

数据结构--图的遍历 BFS

数据结构–图的遍历 BFS 树的广度优先遍历 从 1 结点进行 b f s bfs bfs的顺序&#xff1a; 【1】 【2】【3】【4】 【4】【6】【7】【8】 图的广度优先遍历 从 2 号点开始 b f s bfs bfs的顺序&#xff1a; 【2】 【1】【6】 【5】【3】【7】 【4】【8】 树 vs 图 不存在“回…

appium中toast识别

目录 一、什么是Toast&#xff1f; 二、环境前提 三、修改配置 四、安装驱动 五、常见报错及解决方案 1、cnpm 不识别&#xff0c;提示不是内部或外部命令 2、npm 也不识别 3、报错 六、代码节选 一、什么是Toast&#xff1f; Android中的Toast是一种简易的消息提示框…

IDEA+springboot+ MyBatis +ssm+ Bootstrap+Mysql房屋租赁系统源码

IDEAspringboot MyBatis ssm BootstrapMysql房屋租赁系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.房源列表3.添加房源4.在租列表5. 已退租列表6. 看房申请7. 退租申请8. 待处理报障9.已处理报障10.我要收租11.租客待缴租金12.租客已缴租金13.查看日程14.添加日…

2023.07.23 学习周报

文章目录 摘要文献阅读1.题目2.问题3.解决方案4.方法4.1 框架4.2 基于高斯扩散的修复方法4.3 PM2.5的误差校正模型4.4 PM2.5数据修复的GD-GRU模型4.5 评估指标 5.实验5.1 网络参数5.2 实验结果 6.结论7.展望 Ns方程1.NS方程每一项的物理意义2.NS方程的推导过程3.深度学习与NS方…

机器学习预测指数

导包&#xff0c;收集数据 import numpy as np import pandas as pd import talib import warnings warnings.filterwarnings(ignore) import tushare as tsdata ts.get_k_data(codehs300, start2005-04-08, end2023-11-08, ktypeD) data data.set_index(date) data data[[…

ftp和sftp区别,以及xftp的使用

网上找链接找的很辛苦对吧&#xff01; 网上下载的破解版还不用。而且用没多久又说要更新了&#xff0c;又得重新找。 这下直接把官方免费获取链接发给你&#xff0c;就不用在被这种事情麻烦了。 家庭/学校免费 - NetSarang Website (xshell.com):家庭/学校免费 - NetSarang W…

JVM运行时数据区——方法区、堆、栈的关系

方法区存储加载的字节码文件内的相关信息和运行时常量池&#xff0c;方法区可以看作是独立于Java堆的内存空间&#xff0c;方法区是在JVM启动时创建的&#xff0c;其内存的大小可以调整&#xff0c;是线程共享的&#xff0c;并且也会出现内存溢出的情况&#xff0c;也可存在垃圾…

Idea中git push to origin/master was rejected错误解决方案

Idea中git push to origin/master was rejected错误解决方案 问题描述解决方法 问题描述 idea开发中,需要将项目发布到gitee上,在gitee上创建仓库后,通过idea中git推送项目代码提示: push to origin/master was rejected 解决方法 gitee创建仓库时创建了README.md文件,本地…

C# 通用OCR识别 文字识别 中文识别 服务

软件说明 基于以下开源项目&#xff0c;做了再次封装 GitHub - sdcb/PaddleSharp: .NET/C# binding for Baidu paddle inference library and PaddleOCR 自带模型&#xff0c;可离线部署&#xff1b; 技术路线&#xff1a;VS2022Sdcb.PaddleInferenceSdcb.PaddleOCRNLogNan…

uniapp 微信小程序 文章详情页顶部标题动态对应文章列表页返回的标题

文章详情页代码图&#xff1a; 代码&#xff1a; template <template><view class"policy-detail"><view class"title">{{description}}</view><view class"time">{{createTime}}</view><view class&q…

FIO的安装及使用

简介 FIO是一款测试IOPS的工具&#xff0c;用于对磁盘进行压力测试和验证&#xff0c;磁盘I/O是检查磁盘性能的重要指标&#xff0c;可以按照负载情况分成照顺序读写&#xff0c;随机读写两大类&#xff0c;FIO可产生很多线程或进程并执行用户指定的特定类型的I/O操作&#xf…

python_day12_map

map方法&#xff08;算子&#xff09; 导包 from pyspark import SparkConf, SparkContext import os为pyspark指向python解释器 os.environ[PYSPARK_PYTHON] "D:\\dev\\python\\python3.10.4\\python.exe"创建SparkContext对象 conf SparkConf().setMaster(&qu…