01背包,设定一个背包,他有一个maxweight,现在你有n个物品,每个物品都有重量与其价值,现在要你求取得的最大价值。
运用递归的思想,假如现在是从最后一个开始选,如果这个东西的重量大于背包的重量,那是不是可以从第n-1个物体开始选。
假如这个东西的重量小于背包的重量,那么现在你将面临两个选择,一不选,那么你就跳过了这个物品,就可以从n-1开始选。 二,选,假如你选了的话,那么背包的重量就减少了,而且背包的价值提高了,那么就可以给定一个数去储存 这个价值并继续从下一个开始选。最后比较n,n-1,。。。。到0的价值大小。 就给定一个比较大小的函数即可输出最大价值。
代码如下:
#include <iostream>
#include<iomanip>
using namespace std;
struct A //建立结构体储存重量与价值
{
int weight;
int value;
}bag[100];
int find(int weight,int n)//递归函数,返回最大值
{
if (weight == 0 || n == 0) return 0;//如果背包容量==0或者物体个数==0 那么返回0.
else
if (bag[n-1].weight > weight) return find(weight, n-1); //如果最后一个物体的重量大于背包容量,那么寻找下一个物体。
else
{
int temp1 = find(weight, n-1); //假如容量大于物体的质量 那么面临选择, 若不选则跳过,进行下一个物体的选择
int temp2 = bag[n-1].value+find(weight - bag[n-1].weight, n-1); //若进行选择 则记录价值大小,并减去物体的质量,再进行下一个物体的选择。
return temp2 > temp1 ? temp2 : temp1;//返回价值最大的值。
}
}
int main()
{
int bagweight, num;
cin >> bagweight;
cin >> num;
for (int i = 0; i < num; i++)
{
cin >> bag[i].weight >> bag[i].value;
}
cout << find(bagweight, num);
}