01背包问题是所有背包问题的基础,只有学好01背包,才能掌握背包问题。
01背包:“01”表示只能取或者不取,下面看例题:
【题目描述】
一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn,求旅行者能获得最大总价值。
【输入】
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
10 4
2 1
3 3
4 5
7 9
【输出样例】
12
12
好了,这是一个经典的01背包问题
做01背包问题只要记住一个公式:
d[j]=max(d[j],d[j-w[i]]+c[i];
公式中有 i 有 j ,那么这是一个双重循环,w 数组表示重量,c 数组表示价值。
完整的c++代码如下:
#includeusing namespace std; int v,n,d[2000],c[50],w[50]; //d数组的下标表示容量 int main() { cin >>v >>n; //v表示容量,n表示数量 for (int i=1;i<=n;i++) cin >>w[i] >>c[i]; for (int i=1;i<=n;i++) for (int j=v;j>=w[i];j--) //01背包中,第二重循环要倒序,从v到w[i] { d[j]=max(d[j],d[j-w[i]]+c[i]); //公式 } cout < 这些东西只要背下来就行了,非常简单。



