【Day6】做了一些有关背包的题目
具体可分为3大类:
1、01背包:每种物品只有一件, 取或不取 2、多重背包:每种物品数量不等(或者说随机?),用二进制优化,将其转化为01背包,具体代码如下 for (int i = 1; i <= n; i++)
{
int x, y, z, jc = 1;
cin >> x >> y >> z;
while (jc <= z)
{
v[++cnt] = x * jc;
w[cnt] = y * jc;
z -= jc;
jc *= 2;
}
if (z != 0) w[++cnt] = y * z, v[cnt] = x * z;
}
3、完全背包:每种物品数量不限,将01的f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i])改成f[i][j] = max(f[i - 1][j], f[i][j - v[i]] + w[i])即可
实际做题时要将三者区分清楚,同时注意混合运用。
【Day7】STL的相关学习与复习,今天做的主要是栈的题
栈:stack < > st; st.push_back(); st.top(); st.pop(); 遵循先进后出原则
一些题目:
括弧匹配检验:非常经典的题目,遇到右括号,判断栈顶是否是相对应的左括号。
后缀表达式求值:遇到数字进栈,遇到符号取出栈顶两元素,运算结果再进栈。
中缀转后缀:遇到数字输出, 遇到符号比较与栈顶符号的运算优先级,如果压不住(也就是优先级低于栈顶符号),则输出并弹出栈顶符号,直到要进栈的符号优先级大于新的栈顶符号或栈为空;如遇右括号,弹出栈顶符号直到弹出左括号。
表达式求值:将上两题结合起来