1.每日一题
补充书架
https://leetcode.cn/problems/filling-bookcase-shelves/description/
思路与算法:
根据题意,按顺序将这些书摆放到总宽度为 shelfWidth的书架上。先选几本书放在书架上,然后再建一层书架。重复这个过程,直到把所有的书都放在书架上。考虑用动态规划来解决这个问题,dp[i]来表示放下前 i本书所用的最小高度。 因为最多 1000本书, 每本书高度最大 1000,我们可以把 dp[i]初始化为 1000000, 初始化 dp[0] 为零,表示没有书是高度为零。
当我们要放置前 i本书时候,假定前 j本书放在上面的书架上,其中 j<i, 前 j本书放好后剩余的书放在最后一层书架上, 这一层书架的高度是这部分书的高度最大值,由此得到如此递推公式:dp[i]=min(dp[j]+max(books[k]))其中满足0≤j≤k<i≤n,∑books[k]≤shelfWidth我们循环遍历 i, 求出 dp[i]的值,最后返回 dp[n]为最终答案。
代码如下:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
vector<vector<int>>books{ {1,1},{2,3},{2,3},{1,1},{1,1},{1,1},{1,2} };//可以自己更改
int shelfWidth;
cin >> shelfWidth;
int n = books.size();
vector<int> dp(n + 1, 1000000);
dp[0] = 0;
for (int i = 0; i < n; ++i)
{
int maxHeight = 0, curWidth = 0;
for (int j = i; j >= 0; --j)
{
curWidth += books[j][0];
if (curWidth > shelfWidth)
{
break;
}
maxHeight = max(maxHeight, books[j][1]);
dp[i + 1] = min(dp[i + 1], dp[j] + maxHeight);
}
}
cout << dp[n] << endl;
return 0;
}
2.每日学习
继续完善了数据结构的项目图书馆里系统
编写完善了图书的借阅和归还
代码如下:
void jie_name(struct LNode *L, struct UNode *U)
{
FILE *fp,*fq;
char name[200];
char c;
int flag = 0;
printf("请输入你要借阅的图书名称,如果要退出则输入“exit”:");
while (1)
{
scanf("%s", name);
if (!strcmp(name, "exit"))
{
printf("按任意键退出..........\n");
getch();
return;
}
struct book *p;
p = L->next;
int found = 0; // 用于标记是否找到匹配的书名
while (p != NULL)
{
if (!strcmp(name, p->name))
{
if (p->Borrow == 1)
{
printf("该书已经被借出!\n");
found = 1;
break;
}
else
{
printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
printf("\t是否确认借阅此书(‘Y’或者‘N’)");
getchar();
scanf("%c", &c);
if (c == 'Y')
{
p->Borrow = 1;
printf("借阅成功!\n");
found = 1;
struct user *q;
q = U->next;
while (q != NULL)
{
if (!strcmp(q->username, user_zhanghao) && !strcmp(q->userpassword, user_mima))
{
int i;
for (i = 0; i < 3; i++)
{
if (q->num[i] == 0)
{
q->num[i] = p->num;
break;
}
}
}
q = q->next;
}
}
else
{
printf("已经取消操作,按任意键继续查找下一本书...\n");
getch();
}
}
}
p = p->next;
}
if (found == 0)
{
system("cls");
printf("图书系统没有记录该书名的书或者该书已经被借阅!按任意键返回..........");
return;
}
else
{
fp = fopen("book.txt", "w");
struct book *p;
p = L->next;
while (p != NULL)
{
fprintf(fp, "%d %s %s %d %d %d %d\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day, p->Borrow);
p = p->next;
}
fclose(fp);
fq=fopen("user.txt","w");
struct user *q;
q = U->next;
while (q != NULL)
{
fprintf(fq, "%s %s %d %d %d\n", q->username, q->userpassword, q->num[0], q->num[1],q->num[2]);
q = q->next;
}
fclose(fq);
printf("按任意键返回..........\n");
getch();
return;
flag = 1;
}
}
if (flag == 0)
{
printf("操作取消,按任意键退出...\n");
getch();
return;
}
}
void jie_author(struct LNode *L, struct UNode *U)
{
FILE *fp,*fq;
char author[200];
char c;
int flag = 0;
printf("请输入你要借阅的图书名称,如果要退出则输入“exit”:");
while (1)
{
scanf("%s", author);
if (!strcmp(author, "exit"))
{
printf("按任意键退出..........\n");
getch();
return;
}
struct book *p;
p = L->next;
int found = 0; // 用于标记是否找到匹配的书名
while (p != NULL)
{
if (!strcmp(author, p->author))
{
if (p->Borrow == 1)
{
printf("该书已经被借出!\n");
found = 1;
break;
}
else
{
printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
printf("\t是否确认借阅此书(‘Y’或者‘N’)");
getchar();
scanf("%c", &c);
if (c == 'Y')
{
p->Borrow = 1;
printf("借阅成功!\n");
found = 1;
struct user *q;
q = U->next;
while (q != NULL)
{
if (!strcmp(q->username, user_zhanghao) && !strcmp(q->userpassword, user_mima))
{
int i;
for (i = 0; i < 3; i++)
{
if (q->num[i] == 0)
{
q->num[i] = p->num;
break;
}
}
}
q = q->next;
}
}
else
{
printf("已经取消操作,按任意键继续查找下一本书...\n");
getch();
}
}
}
p = p->next;
}
if (found == 0)
{
system("cls");
printf("图书系统没有记录该书名的书或者该书已经被借阅!按任意键返回..........");
return;
}
else
{
fp = fopen("book.txt", "w");
struct book *p;
p = L->next;
while (p != NULL)
{
fprintf(fp, "%d %s %s %d %d %d %d\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day, p->Borrow);
p = p->next;
}
fclose(fp);
fq=fopen("user.txt","w");
struct user *q;
q = U->next;
while (q != NULL)
{
fprintf(fq, "%s %s %d %d %d\n", q->username, q->userpassword, q->num[0], q->num[1],q->num[2]);
q = q->next;
}
fclose(fq);
printf("按任意键返回..........\n");
getch();
return;
flag = 1;
}
}
if (flag == 0)
{
printf("操作取消,按任意键退出...\n");
getch();
return;
}
}
void guihuan(struct LNode *L, struct UNode *U)
{
system("cls");
FILE *fp,*fq;
int num;
char c;
printf("请输入你要归还的图书书号,如果要退出则输入'0':");
while (1)
{
scanf("%d", &num);
if (num==0)
{
printf("按任意键退出..........\n");
getch();
break;
}
struct book *p;
p = L->next;
int found = 0; // 用于标记是否找到匹配的书名
while (p != NULL)
{
if (num==p->num)
{
if (p->Borrow == 0)
{
printf("该书未被借阅!\n");
found = 1;
break;
}
else
{
printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
printf("\t是否确认借阅此书(‘Y’或者‘N’)");
getchar();
scanf("%c", &c);
if (c == 'Y')
{
struct user *q;
q = U->next;
while (q != NULL)
{
if (!strcmp(q->username, user_zhanghao) && !strcmp(q->userpassword, user_mima))
{
int i;
for (i = 0; i < 3; i++)
{
if (q->num[i] == p->num)
{
p->Borrow = 0;
printf("归还成功!\n");
found = 1;
q->num[i] = 0;
break;
}
}
}
q = q->next;
}
if(found==0)
{
printf("您未借阅此书!按任意键返回..........");
getch();
break;
}
}
else
{
printf("已经取消归还,按任意键返回..........\n");
getch();
break;
}
}
}
p = p->next;
}
if (found == 0)
{
system("cls");
printf("图书系统没有记录该书号的图书!按任意键返回..........");
getch();
break;
}
else
{
fp = fopen("book.txt", "w");
struct book *p;
p = L->next;
while (p != NULL)
{
fprintf(fp, "%d %s %s %d %d %d %d\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day, p->Borrow);
p = p->next;
}
fclose(fp);
fq=fopen("user.txt","w");
struct user *q;
q = U->next;
while (q != NULL)
{
fprintf(fq, "%s %s %d %d %d\n", q->username, q->userpassword, q->num[0], q->num[1],q->num[2]);
q = q->next;
}
fclose(fq);
printf("按任意键返回..........\n");
getch();
break;
}
}
}
编写了用户观看自己借阅了哪些图书的函数
代码如下:
void jieyuebook(struct LNode *L,struct UNode *U)
{
system("cls");
struct user *q;
q = U->next;
while (q != NULL)
{
if (!strcmp(q->username, user_zhanghao) && !strcmp(q->userpassword, user_mima))
{
printf("\t\t已借阅的图书信息:\n");
int i;
for (i = 0; i < 3; i++)
{
if (q->num[i] != 0)
{
struct book *p;
p = L->next;
while (p != NULL)
{
if (p->num == q->num[i])
{
printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日\n\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
break;
}
p = p->next;
}
}
}
break;
}
q = q->next;
}
printf("按任意键返回..........\n");
getch();
}
文件在改动时会出现乱码的现象,不知道哪里出错,明天可以进行修改
博客记录了每日学习进展。一是解决“补充书架”算法题,采用动态规划,用 dp[i]表示放前 i 本书的最小高度,通过递推公式求解;二是完善数据结构项目图书馆系统,编写图书借阅、归还及查看借阅信息函数,但文件改动出现乱码待解决。

220

被折叠的 条评论
为什么被折叠?



