我因为准备小学毕业考,已经几乎3个月没有写book了,最近得补一补,原力分已经掉了10分了......
这次我们的主题是最基本的背包题——0-1背包。
0-1背包题目:
题目描述:
现在有一个容量为V的背包,有n件物品,每件物品的体积为w[i]价值为c[i]
要把部分物品塞到背包里,它们的总体积不能超过V,那么这些物品的总价值最高是多少?
暴力——搜索
这玩意是从最暴力的全循环枚举变过来的。
因为每个物品都只有两种状态:拿和不拿。
所以我们就可以枚举一下。
#include <iostream>
using namespace std;
int w[10005],c[10005];
int solve(int n,int m){//int n表示目前从n开始往后取,取了“总的n”-“参数n”
if (m<0)return -2147483647; //超出容量,不行
if (n==0)return 0; //结束了,开始回溯
int x=solve(n-1,m);//不取第n个物品
if (m>=w[n])x=max(x,solve(n-1,m-w[n])+c[n]);//取
return x;
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%d%d",&w[i],&c[i]);
}
printf("%d\n",solve(n,m));//倒序,需要回