算法回忆录(3)

news2024/12/26 12:07:05

11. 假设有7个物品,它们的重量和价值如下表所示。若这些物品均不能被分割,且背包容量M=150设计算法求解怎么装才能使得获取的价值最大请写出伪代码。     

#include <stdio.h>
 
#define MAX_ITEMS 100
#define MAX_WEIGHT 1000
 
int max(int a, int b) {
    return (a > b) ? a : b;
}
 
// 动态规划求解背包问题
void knapsack(int n, int capacity, int weights[], int values[]) {
    int dp[MAX_ITEMS + 1][MAX_WEIGHT + 1] = {0};
    int i, w;
 
    // 填表格
    for (i = 1; i <= n; i++) {
        for (w = 1; w <= capacity; w++) {
            if (weights[i - 1] > w) {
                dp[i][w] = dp[i - 1][w];
            } else {
                dp[i][w] = max(dp[i - 1][w], values[i - 1] + dp[i - 1][w - weights[i - 1]]);
            }
        }
    }
 
    // 回溯找出装入背包的物品
    int res[MAX_ITEMS];
    int k = n, c = capacity;
    int num = 0;
    while (k > 0 && c > 0) {
        if (dp[k][c] != dp[k - 1][c]) {
            res[num++] = k;
            c -= weights[k - 1];
        }
        k--;
    }
 
    // 输出结果
    for (i = num - 1; i >= 0; i--) {
        printf("%-d ", res[i]);
    }
    printf("\n");
    printf("end");
}
 
int main() {
    int n, capacity;
    scanf("%d %d", &n, &capacity);
 
    int weights[MAX_ITEMS], values[MAX_ITEMS];
    for (int i = 0; i < n; i++) {
        scanf("%d", &weights[i]);
    }
 
    for (int i = 0; i < n; i++) {
        scanf("%d", &values[i]);
    }
 
    // 调用背包问题求解函数
    knapsack(n, capacity, weights, values);
 
    return 0;
}

 运行结果:

12. 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 或 3 个台阶。你有多少种不同的方法可以爬到楼顶呢?请用动态规划算法解决并写出伪代码。(n需要在算法中输入)

#include <stdio.h>
 
int climbStairs(int n) 
{
    int dp[n];
    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;
    for (int i = 3; i <= n; i++)
    {
        dp[i] = dp[i-1] + dp[i-2]+dp[i-3];
    }
    return dp[n];
}
 
int main()
 {
    int n ;
    scanf("%d",&n);
    int result = climbStairs(n);
    printf("%d\n", result); // 输出结果
    return 0;
}

运行结果:

13.最长公共子序列是指两个序列共同拥有的最长的子序列,这个子序列在两个序列中的位置不必连续,但必须保持原有的顺序。例如,对于序列X=ABCBDAB”和序列Y=BDCABA”,它们的最长公共子序列为“BCBA”,长度为4。编程输入两个字符串,求其最长公共子序列的长度。

#include <stdio.h>  
#include <string.h>  
  
// 函数声明  
int longestCommonSubsequence(char *X, char *Y);  
  
int main() {  
    char X[100], Y[100];  
  
    // 输入两个字符串  
    printf("Enter the first string: ");  
    scanf("%99s", X); // 使用%99s限制输入长度,避免溢出  
    printf("Enter the second string: ");  
    scanf("%99s", Y);  
  
    // 调用函数计算LCS长度  
    int length = longestCommonSubsequence(X, Y);  
  
    // 输出LCS长度  
    printf("The length of the Longest Common Subsequence is: %d\n", length);  
  
    return 0;  
}  
  
// 函数定义:计算两个字符串的最长公共子序列的长度  
int longestCommonSubsequence(char *X, char *Y) {  
    int m = strlen(X);  
    int n = strlen(Y);  
  
    // 创建一个二维数组dp,用于存储子问题的解  
    int dp[m + 1][n + 1];  
  
    // 初始化dp数组  
    for (int i = 0; i <= m; i++) {  
        for (int j = 0; j <= n; j++) {  
            if (i == 0 || j == 0) {  
                dp[i][j] = 0;  
            }  
        }  
    }  
  
    // 填充dp数组  
    for (int i = 1; i <= m; i++) {  
        for (int j = 1; j <= n; j++) {  
            if (X[i - 1] == Y[j - 1]) {  
                dp[i][j] = dp[i - 1][j - 1] + 1;  
            } else {  
                dp[i][j] = (dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1];  
            }  
        }  
    }  
  
    // dp[m][n]存储了X和Y的最长公共子序列的长度  
    return dp[m][n];  
}

运行结果:

14. 填入0~9的数字。要求:连续的两个数字不能相邻。(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请输出一个表示方案数目的整数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int disp(int a[], int n) {
    int i;
    for (i = 0; i < 9; i++) {
        if (abs(a[i] - a[i + 1]) == 1 && i != 2 && i != 6)
            return 0;
    }
    for (i = 0; i < 6; i++) {
        if (abs(a[i] - a[i + 4]) == 1)
            return 0;
    }
    for (i = 0; i < 7; i++) {
        if (abs(a[i] - a[i + 3]) == 1 && i != 3)
            return 0;
    }
    for (i = 0; i < 5; i++) {
        if (abs(a[i] - a[i + 5]) == 1 && i != 2)
            return 0;
    }
    return 1;
}
 
void swap(int *xp, int *yp) {
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}
 
void permute(int *a, int l, int r, int *count) {
    int i;
    if (l == r) {
        if (disp(a, r + 1)) {
            (*count)++;
        }
    } else {
        for (i = l; i <= r; i++) {
            swap((a + l), (a + i));
            permute(a, l + 1, r, count);
            swap((a + l), (a + i)); // backtrack
        }
    }
}
 
int main() {
    int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int n = 10;
    int count = 0;
 
    permute(a, 0, n - 1, &count);
 
    printf("%d\n", count);
    return 0;
}

运行结果: 

15. 编程输出一个特别的数,该数是一个由1~9组成的9位数,每个数字只能出现一次,且这个9位数由高位到低位前i位能被i整除。

#include <stdio.h>
int main(void)
{
long i[9];
long j, n;
i[4] = 5;
for (i[0] = 1; i[0] < 10; i[0] += 2)
{
for (i[1] = 2; i[1] < 9; i[1] += 2)
{
for (i[2] = 1; i[2] < 10; i[2] += 2)
{
if (i[2] == i[0])
continue;
for (i[3] = 2; i[3] < 9; i[3] += 2)
{
if (i[3] == i[1])
continue;
for (i[5] = 2; i[5] < 9; i[5] += 2)
{
if (i[5] == i[3] || i[5] == i[1])
continue;
for (i[6] = 1; i[6] < 10; i[6] += 2)
{
if (i[6] == i[4] || i[6] == i[2] || i[6] == i[0])
continue;
for (i[7] = 2; i[7] < 9; i[7] += 2)
{
if (i[7] == i[5] || i[7] == i[3] || i[7] == i[1])
continue;
for (i[8] = 1; i[8] < 10; i[8] += 2)
{
if (i[8] == i[6] || i[8] == i[4] || i[8] == i[2] || i[8] == i[0])
continue;
n = 0;
for (j = 0; j < 9; j++)
{
n = n * 10 + i[j];
if (n % (j + 1) != 0)
break;
}
if (j == 9)
printf("%ld\n", n);
}
}
}
}
}
}
}
}
}

运行结果:

 结语 

不举步,越不过栅栏

不迈腿,登不上高山

!!!

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

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

相关文章

怎么读取FRM、MYD、MYI数据文件

一、介绍frm、MYD、MYI文件 在MySQL中&#xff0c;使用MyISAM存储引擎时&#xff0c;数据库表会被分割成几个不同的文件文件描述功能扩展名FRM 文件表结构定义文件存储表的结构信息&#xff0c;字段、索引等.FRMMYD 文件数据文件包含表的实际数据.MYD&#xff08;MYData&#x…

Vue3安装ffmpeg做视频截取报错

通过 yarn 安装 ffmpeg 时报错。 即&#xff0c;执行以下指令时报错&#xff1a; yarn add ffmpeg/ffmpeg^0.10.0 yarn add ffmpeg/core^0.10.0错误信息&#xff1a; node_modules\pngquant-bin: Command failed. Error: pngquant failed to build, make sure that libpng-d…

Unity强化工程 之 SpriteRender

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1.SpriteRenderer是什么 渲染精灵用的&#xff0c;是渲染的核心组件&#xff0c;有许多重要参数所以要详细讲一讲 Spri…

从数据孤岛到一体化平台:PLM系统的变革之路

在当今快速变化的商业环境中&#xff0c;产品生命周期管理&#xff08;Product Lifecycle Management, PLM&#xff09;系统已成为企业提升竞争力、加速产品创新、优化资源配置的关键工具。相较于传统的产品数据管理&#xff08;Product Data Management, PDM&#xff09;系统和…

WPF MVVM模式图片占用问题

在很久以前就遇到这个问题&#xff0c;当时解决了&#xff0c;这过了几年&#xff0c;又遇到这个问题&#xff0c;这里做个总结&#xff0c;防止下次再踩坑了&#xff0c;也顺便帮助一下同样遇到这个问题的朋友 。 出现这个问题的原因是&#xff1a;将文件路径绑定到Image的Sou…

BUUCTF [安洵杯 2019]easy_serialize_php 1

打开题目&#xff0c;看到一串php代码&#xff0c;试着代码审计一下&#xff0c;看一下有用信息 可以看出是通过$_SESSION[img]来读取文件 extract可以将数组中的变量导入当前变量表 也就是说我们可以伪造$_SESSION 数组中的所有数据 这里传递一个参数fphpinfo 先用hackbar进…

软件工程课程实习报告(仅供参考)

一&#xff1a;实习内容设计与实现&#xff1a; 实习一&#xff1a;Git分布式版本控制 本实验的主要目的是学习和掌握Git作为版本控制工具的基本使用方法&#xff0c;特别是在团队协作开发中的重要性。具体目标包括&#xff1a; 1. 理解Git的基本概念和工作原理&#xff0c;…

【AI】可变形卷积Deformable Conv

卷积对大家来说并不陌生了&#xff0c;这里主要描述Deformable Conv。其在论文中也是常见的一个术语&#xff0c;Deformable Convolutional Networks(DCN) 还可以细分成可变形卷积、对候选区域的池化等。 传统卷积操作 将特征图分成一个个与卷积核大小相同的部分&#xff0c;…

k8s—部署dashboard可视化界面

1、下载recommended.yaml配置文件 1&#xff09;根据自己安装的kubernetes版本安装适配的dashboard 我安装的kubernetes是1.24.2版本的&#xff0c;需要安装v:2.6.1版本的dashboard 2&#xff09;下载地址&#xff1a;https://raw.githubusercontent.com/kubernetes/dashboa…

【机器学习】神经网络的无限可能:从基础到前沿

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 在当今人工智能的浪潮中&#xff0c;神经网络作为其核心驱动力之一&#xff0c;正以前所未有的速度改变着我们的世界。从图像识别到自然语言处理&#xff0c;从自动驾驶到医疗诊断&#xff0c;神经网络的…

electron 配置、打包 -报错解决

目录 一、配置途中遇到的问题&#xff1a; 二、 make 配置好后开始打包 三、Electron-builder 打包报错 一、配置途中遇到的问题&#xff1a; 1. 安装 yarn add electron -D 一直卡在这里失败 一直卡可以使用下面这个&#xff0c;然后再重新装依赖 1. 采用新的镜像地址 npm …

proteus仿真c51单片机(二)中断控制流水灯(电路设计及代码)

实验要求 8路流水灯&#xff0c;K1和K2都未按下时&#xff0c;主程序执行LED流水灯程序&#xff0c;K1按下时&#xff0c;左右4只LED交替闪烁&#xff0c;K2按下时8只LED全部闪烁4次&#xff0c;设置外部中断1为高优先级。 实验步骤 1、打开PROTEUS软件选取元件&#xff0c…

未授权访问漏洞(重点版─=≡Σ(((つ•̀ω•́)つ)

1.* Redis 搭建靶场环境&#xff1a; 进入目录:cd/vulhub-master/redis/4-unacc 启动:docker-compose up-d 检查:docker-compose ps vi docker-compose.yml //查看端口和版本号 安装redis工具 在kali上安装redis进行服务链接 #安装redis apt-get install redis #redi…

GD 32 IIC 驱动代码

前言&#xff1a; 学会IIC驱动的原理&#xff0c;时序和代码实现 1.0 GPIO初始化 从原理图中可以看出IIC对应的时钟线和数据线在PB端口&#xff0c;因此需要初始化GPIOB的时钟&#xff0c;同时初始化GPIOB_PIN_6 | 7,的引脚&#xff0c;设置为开漏输出模式。 什么事开漏&…

构建二叉树并后序遍历

题目来源&#xff1a;牛客网清华考研oj题 http://www.nowcoder.com/questionTerminal/4b91205483694f449f94c179883c1fef 题目&#xff1a;如下图 答案&#xff1a;如下图 #include<stdio.h> #include<stdlib.h>typedef struct TreeNode{char val;struct TreeNod…

java之IO篇高级流——缓冲流、转化流、序列化流、打印流、压缩流

前言 上一篇IO流就介绍了File和基本流&#xff0c;这节介绍好用的高级流。 还有IO流的心得&#xff1a;随用随创建&#xff0c;什么时候不用什么时候关闭 目录 前言 一、缓冲流 1.体系图 2.字节缓冲流 &#xff08;1&#xff09;用法 &#xff08;2&#xff09;底层原理 …

JavaSE之常用API(前一部分)

一、String 1.1 是什么 String字符串类,底层就是一个字符数组,所以字符串很多特性就是数组的特征 1 字符串一旦创建,不能修改 2 为了提高字符串的访问效率,Java提供了一种缓存技术,字符串常量池 3 如果是用" " 就不会再堆内存创建对象,而是直接再常量池进行搜索,如果…

Java反序列化漏洞实战:原理剖析与复现步骤

文章目录 java反序列化概念数据示例Ysoserial工具使用概念原生态api第三方组件概念复现 反序列化示例靶场过程 在现代应用程序开发中&#xff0c;Java反序列化漏洞已成为一个备受关注的安全问题。反序列化是Java中用于将字节流转换回对象的过程&#xff0c;但如果没有妥善处理&…

搭建PXE实现服务器自动部署

PXE&#xff08;Preboot Execution Environment&#xff09;是一种计算机启动技术&#xff0c;它允许计算机从网络上的服务器而不是从本地硬盘或光盘等存储介质上启动。这种技术主要应用在无盘工作站、网络安装操作系统、远程维护等方面。 环境&#xff1a;一台rhel7.9作为PXE…

Java学习十五—异常处理

一、关于异常 1.1 简介 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是指程序执行过程中可能遇到的意外或错误情况。 Java异常处理是Java语言中一个重要的机制&#xff0c;用于处理程序运行时发生的异常情况。 ​​ 1.2 分类 Java异常分为两大类&#xff1…