01背包
哈喽啊!这是我的第—篇讲解(^o^)/~
谢谢你能点开我的一文不值的讲解(๑′ᴗ‵๑)
蒟蒻不才,还望大佬多多指教 ……
(此处省略∞字)
—————————————————————————————————
一.例题选择
这个题库来讲,首推 1267:【例9.11】01背包问题 ,以及1290:采药
洛谷:
emmm…,可以选择做一下 P1048 [NOIP2005 普及组] 采药(其实与一本通1290一样),和 P1616 疯狂的采药
再其他的题库就自己去探索吧!(原因是我懒得找)
二.基本思路+要点归纳
1.特点: 每种物品仅有一件,可以选择放或不放
2.状态定义:f[i][v]=前i件物品 (部分或全部) 正好放入一个容量为v的背包中可以获取的最大价值
3.状态转移方程:所以,01背包的状态转移方程便是:
f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i])
{
对于该式的解读如下图:
}
三.基础代码
代码十分简练 (我参考数据与 1267:【例9.11】01背包问题):
#include<iostream>
#include<cstdio>
using namespace std;
const int N=35,M=205;
int m,n,f[M],w[N],c[N];
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++) cin>>w[i]>>c[i];
for(int i=1;i<=n;i++)
for(int j=m;j>=1;j--)
if(j>=w[i])
f[j]=max(f[j],f[j-w[i]]+c[i]);
cout<<f[m];
return 0;
}
蒟蒻的第一篇讲解,如果有错,大佬麻烦私聊通知,Thanks♪(・ω・)ノ
十分感谢你有耐心读完我的题解 点个赞支持一下吧(〃'▽'〃)
ヾ( ̄▽ ̄)Bye~Bye~