错因分析
♦对文件的保存不够恰当,例如第一题和第三题的题目,我是真的很愤怒,第一题在我写了一个多小时,终于样例成功.可是当我再一次打开文件时,里面只有我最开始的代码,谁可以告诉我这是为什么(我绝对保存了,还试了样例),还有第三题,也是莫名失踪,那个躺拿35分的题,我也是0分,真是愤怒(;′⌒`)
♦对字符串及其相应的应用掌握不够,例如今天的第二题,如果想简单一点,还是很好实现的,但是我由于对字符串掌握不牢靠,对那些简单的问题处理起来特别麻烦,写了好久还是放弃了
学习方法
♦今天学习了GQL大佬的写题方法,首先把自己的思路给写了出来,然后在大致思路的基础上去敲题,感觉思路清晰明快了了许多,找起错误来也更加快了,所以今天第一题我本来都放弃了,可我绝对思路很清晰,就照思路一步一步改,错误也还找的快
♦我今天改了我好久以来的一个习惯,以前我做题都是从第一题做起,然后死磕到最后一题,导致后面的即使很容易实现也没有做,今天我敲了一下第一,二题,发现总不能一遍过,由于我在题目下写了思路,我也就不怕到时候回来看题时不知道自己写的是什么,于是我就放心大胆的去看后面的题目,发现最后以题特别简单,然后就对啦(也就只有最后一题让我今天得了分(;′⌒`))
题目分析:
第一题: Bags (Bags)
题目描述
ldl和好朋友们要去爬山啦!他们一共有 K 个人,每个人都会背一个包。这些包的容量是相同的,都是 V。可以装进背包里的一共有 N 种物品,每种物品都有给定的体积和价值。在 ldl 看来,合理的背包安排方案是这样的:
1.每个人背包里装的物品的总体积恰等于包的容量。
2.每个包里的每种物品最多只有一件,但两个不同的包中可以存在相同的物品。
3.任意两个人,他们包里的物品清单不能完全相同。
在满足以上要求的前提下,所有包里的所有物品的总价值最大是多少
输入数据
第一行有三个整数:K、V、N
第二行开始的 N 行,每行有两个整数,分别代表这件物品的体积和价值。
输出数据
只需输出一个整数,即在满足以上要求的前提下所有物品的总价值的最大值。
输入样例
2 10 5
3 12
7 20
2 4
5 6
1 1
输出样例
57
数据约定
总人数 K<=50。
每个背包的容量 V<=5000。
物品种类数 N<=200。
其它正整数都不超过 5000。
输入数据保证存在满足要求的方案。
思路
这种类型的题有一个固定的名称,叫多人背包,意思就是让你求前k个优解,那很显然的这个就是要用DP来解
1.状态设置
f[i][k]
其中i表示是装到了第几个物品,而k代表的是第几优解
2.转移方程
if(f[j][c1]>f[j-V[i]][c2]+W[i])
now[++cnt]=f[j][c1++];
else now[++cnt]=f[j-V[i]][c2++]+W[i];
这是一个解决最优解和次优解的方式
你当前的最优解是取f[j-V[i]]
的最优解+w[i]与当前最优解f[j][c1]
的max,如果确定是由之前最优解推出来的,则次优解就是在f[j-V[i]]
的次优解+w[i]和当前最优解之间取max,依次类推.......(tips由于我换了一个now数组来储存这次的最优解及k优解,所以在f数组中的上一步最优解和k优解是没有变化的,这也便于我们去寻找这一步1~k优解)
3.循环方式和背包是差不多的,只是在内部多加了一个1~k优解的确定
4.我输出1~k优解之和就可以了