动态规划 DP 应用之 01 背包

问题描述:n 个不同的物品,每个物品只有一个,有价值 value 和重量 weight 两个属性;背包容量 w。求背包所能容纳的最大价值。

最优子结构:当我们把一件物品放进背包里时,会让总价值变高,并且让背包变重。对某一件物品来说,我们可以选择放或不放,然后移去这件物品所带来的影响。

c(n, w) = max( c(n-1, w), c(n-1, w-W[n]) + C[n] ) ^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ 不放 -> 0 放 -> 1

n:第1个到第n个物品要放进背包内。 w:背包负重上限。 c(n, w):第1个到第n个物品尽量塞进负重限制为w的背包时,最大价值。 W[n]:第n个物品的重量。 C[n]:第n个物品的价值。

动态规划 DP 应用 HamiltonPath 及 TSP

Hamilton Path 及 TSP 都属于 NP 完全问题,目前理论上尚无多项式算法,穷举法的时间复杂度是 O(N!),通过运用动态规划 DP,可以缩短至 O(2^N * N^2)。

输入:无向图 G = (V, E),点集 V = {0, 1, … , n-1},起始点 0

最优子结构:考虑路径上的最后一条边

dp[s,j] = min ( dp[s-{j},i] + adj[i,j] )

dp[s+{j},j] = min ( dp[s,i] + adj[i,j] )

UW 软硬件接口lab3 bufbomb

本实验即常见的缓冲区溢出攻击。(注:新的 64bit Win8/Linux 下这种简单方式无效,x86_64 cpu 的可执行标志位 exec-shield,gcc 栈保护选项开关 -fno-stack-protector)

主函数为 test(),首先声明一个局部变量 volatile int local = 0xdeadbeef,volatile 是编译时不使用 register 优化,必须分配栈空间,后面的实验过程不能覆盖这个 local 变量。

然后就是存在缓冲区溢出漏洞的 getbuf 函数,也就是我们要操作的对象。

UW 软硬件接口lab2 bomb

本实验是解除二进制炸弹。给你一个二进制可执行文件,运行该文件,你需要在没有任何提示的情况下输入6个password,如果都输入正确,则炸弹被解除(完成了实验);如果输入错误,则炸弹爆炸(当然不是真爆炸了,需要重做)。

leetcode - two-sum

原题:

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9

Output: index1=1, index2=2