最近的学习目标还是dp,专业课在学的对象也已经都弄懂了,相比dp,简直就是在放松娱乐。。。
dp的核心感觉就是状态转移方程了,虽然老师给的第一套题是全做完了,但是下一套今天是不打算动的,想和老师说的一样,去看看题,打算静悟会。主要是感觉仍是做题不顺,磕磕绊绊的,完全就是莫名其妙的ac,看自己之前做过去的题第二遍都不一定能做出来,思路也不清晰,就是按照之前的模板,套着套着就过了,很奇怪,感觉不是自己想要的感觉。
虽然菜,但是总结还是得做的,也参考了大佬的文章,总结一下吧,毕竟dp的模板辣么的重要。今天也不去刷题了,安安静静的整理个总结,归纳个模板,看看题,一血还是想的,但是巩固对现在的我而言更重要一些。大部分二维背包都能简化,就不做整理了,直接上最优解。
学的比较有限,暂时只整理背包问题的了,剩下的只能等着再补了。
01背包(给定重量,价值,背包空间,求背包最大价值)
for(int i=0;i<n;i++){
for(int j=W;j>=w[i];j--){//完全背包相反
dp[j]=max(dp[j],dp[j-w[i]]+v[i])
}
}
完全背包(区别01,每件物品可以无限次使用)
for(int i=0;i<n;i++){
for(int j=w[i];j<=W;j++){//容积w的限制下,物品i的多次使用,而01背包的逆向处理就无法实现这个无限次利用
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
多组背包(物品给定件数,01形式)
for(int i=0;i<n;i++){
int num=n[i];
for(int k=0;k<=num[i];k++){
for(int j=W;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
}
多组背包的二进制优化法还不是很明白,暂且不做整理了,等做几道相关的额题,透彻了再补上。
明天也要加油鸭!