2022.1.10

8:40-----10:20

考前临时报佛脚

复习了01背包问题。

有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

总体思路

根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出01背包问题的最优解以及解组成,然后编写代码实现。

背包问题的解决过程

在解决问题之前,为描述方便,首先定义一些变量:

Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j)

当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。

  1. 建立模型,即求max(V1X1+V2X2+…+VnXn);
  2. 寻找约束条件,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小时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值