8:40-----10:20
考前临时报佛脚
复习了01背包问题。
有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
总体思路
根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出01背包问题的最优解以及解组成,然后编写代码实现。
背包问题的解决过程
在解决问题之前,为描述方便,首先定义一些变量:
Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):
当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。
- 建立模型,即求max(V1X1+V2X2+…+VnXn);
- 寻找约束条件,W1X1+W2X2+…+WnXn<capacity(容量);
3、寻找递推关系式,面对当前商品有两种可能性:
由此可以得出递推关系式:
(1)装不下j<w(i) V(i,j)=V(i-1,j)
(2)装的下该不该装j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
4、填表,首先初始化边界条件,V(0,j)=V(i,0)=0;
i(物品编号) 1 2 3 4
w(体积) 2 3 4 5
v(价值) 3 4 5 6
#include<iostream>
using namespace std;
#include <algorithm>(sort)
int main()
{
int w[5] = { 0 , 2 , 3 , 4 , 5 }; //商品的体积2、3、4、5
int v[5] = { 0 , 3 , 4 , 5 , 6 }; //商品的价值3、4、5、6
int bagV = 8; //背包大小
int dp[5][9] = { { 0 } }; //动态规划表
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= bagV; j++) {
if (j < w[i])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
//与上一行比是为了确保最优选;与上一行的比,一个物体只能取一次
}
}
//动态规划表的输出
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 9; j++) {
cout << dp[i][j] << ' ';
}
cout << endl;
}
return 0;
}
10:20----10:40
(3条消息) kkksc03考前临时抱佛脚(C语言)_bu_xiang_tutou的博客-CSDN博客
10:20---11:50
填涂颜色
11:50----12:20
(3条消息) 填涂颜色(C语言)_bu_xiang_tutou的博客-CSDN博客
14:30----15:10 19:10----20:00
听课总结
DFS要用递归,常用于迷宫,联通块问题。
{1}.迷宫问题要3个数组,1.方向数组 2.标记数组 3.还要一个存放迷宫数据的迷宫数组
{2}.迷宫问题要回溯,不然会影响结果。
{3}. 明确的DFS的方向,是根据方向数组移动的,可以向方向数组代表的所有方向移动。
{4}.用DFS遍历的特征,将连在一起的块的数量求出来。
BFS要用到对列,结构体,常用于迷宫最短路径问题。BFS是按层遍历的。
{1}最短路径问题结构体要设置三个变量,分别是x,y,step。
{2}BFS的队头是队列里其它数的上一步!!!
快排运用了分治法,找到一个数,判断它左右两端的数是否小于或者大于它,如果不是的话,将被判断的数移动到这个数的另一侧,循环这个过程,直到把所有的数排好。看了一下C语言调用qsort。
qsort(快速排序)
#include <stdlib.h>//调用的头文件
int compare(const void *value1, const void *value2)
{
return *(int*)value1 - *(int*)value2;//升序
把2放在1前为降序。固定格式
}
qsort(a,n,sizeof(int),compare);//a是数组名,n是数组长度,sizeof是数组的类型,
compare调用函数
double in[100];
int cmp_double(const void* _a , const void* _b) //参数格式固定
{
double* a = (double*)_a; //强制类型转换
double* b = (double*)_b;
return *a > *b ? 1 : -1; //特别注意
}
qsort(in,100,sizeof(in[0]),cmp_double);
15:10----17:30 18:20------19:10 20:00----20:39
马的遍历:
20:39---20:51
(4条消息) 马的遍历(C语言)_bu_xiang_tutou的博客-CSDN博客
总学习时长:8小时