Courses-day-5-DP(动态规划)的初步学习-第一部分

本文发表于csdn,个人blog:blog

Today is the fifth day of the course.

Note:

dp是什么?

动态规划(DP)不是某种具体算法,而是一种思想。
核心在于:把大问题转化为小问题,利用小问题的解,推断出大问题的解。

什么是状态?

例子

《硬币问题》

Luogu-B3635

今天你手上有无限的面值为1,5,11 元的硬币。
给定n,问:至少用多少枚硬币,可以恰好凑出n 元?

思考

用f[x]表示多少钱的时候最小的硬币数,f[x]由上一次选择的最小硬币数+1得到,所以我们只需要找到上一次选择的硬币+1的最小值就可以了。故有状态转移方程:

f ( x ) = { 1 + f [ x − 1 ] 1 + f [ x − 5 ] 1 + f [ x − 11 ] f(x)=\left\{ \begin{aligned} 1+f[x-1]\newline 1+f[x-5]\newline 1+f[x-11]\newline \end{aligned} \right. f(x)= 1+f[x1]1+f[x5]1+f[x11]

《凑字》

现在有一篇文章是一个字,你可以添加一个字或者复制整个文章再粘贴(即字数翻倍)。说人话就是可以使一个数字加1或者×2

求码出n字的最小次数

数组f[x],x表示码出x字所需的最小增加次数,因为x字要么是加以得来,要么是×2得来。

所以如果x是奇数,那么他的次数为:
f [ x ] = f [ x − 1 ] + 1 f[x]=f[x-1]+1 f[x]=f[x1]+1
如果x是偶数,那么他可能是*+1得到的,也可能是×2*得到的,所以有:
f [ x ] = m i n ( f [ x − 1 ] , f [ x / 2 ] ) + 1 f[x]=min(f[x-1],f[x/2])+1 f[x

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学生选课系统是一个常见的应用程序,用于管理学生的选课信息。在C语言中,可以使用文件操作和算法来实现学生选课系统的功能。 以下是一个简单的C语言学生选课系统的示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义课程结构体 typedef struct { char courseCode[10]; char courseName[50]; char courseProperty[20]; char semester[20]; int credit; } Course; // 定义学生结构体 typedef struct { char studentID[10]; char studentName[50]; Course courses[10]; int numCourses; } Student; // 函数声明 void displayMenu(); void searchCourse(Student* student); void displayCourseInfo(Student* student); void addCourse(Student* student); void removeCourse(Student* student); int main() { Student student; student.numCourses = 0; int choice; do { displayMenu(); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: searchCourse(&student); break; case 2: displayCourseInfo(&student); break; case 3: addCourse(&student); break; case 4: removeCourse(&student); break; case 5: printf("Exiting the program...\n"); break; default: printf("Invalid choice. Please try again.\n"); break; } } while (choice != 5); return 0; } // 显示菜单 void displayMenu() { printf("-- Student Course Registration System ---\n"); printf("1. Search course\n"); printf("2. Display course information\n"); printf("3. Add course\n"); printf("4. Remove course\n"); printf("5. Exit\n"); } // 搜索课程 void searchCourse(Student* student) { // 根据菜单选择查询字段,实现相应的查找算法 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Searching course...\n"); } // 显示课程信息 void displayCourseInfo(Student* student) { // 分屏显示课程信息,每屏10条课程记录,按任意键继续 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Displaying course information...\n"); } // 添加课程 void addCourse(Student* student) { // 添加课程到学生的选课列表中 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Adding course...\n"); } // 移除课程 void removeCourse(Student* student) { // 从学生的选课列表中移除课程 // 这里只是一个示例,具体的实现需要根据需求进行编写 printf("Removing course...\n"); } ``` 这个示例中,我们使用了结构体来定义课程和学生的信息。通过菜单选择,可以进行课程的搜索、课程信息的显示、课程的添加和课程的移除等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值