01バックパック(再帰的に解決)

01バックパックは、バックパックを設定し、彼は今、あなたはn個のアイテムを持っている、maxweightを持っていた、各項目は、その重量とその値を持って、今は達成最大値を求めます。

この事の重量はバックパックの重量よりも大きい場合、今、前回の選挙から始まりであれば、再帰のアイデアを使用して、n-1の選択したオブジェクトから開始することはできません。

重量が少ないリュック物の重量よりもある場合は、ここで次の2つの選択肢に直面するだろう、いずれかが選択されていない、あなたはこの記事をスキップし、n-1の開始から選択することができます。あなたが選択した場合第二に、選挙は、その後、バックパックの重量が減少し、バックパックの値を大きくしている、値を格納するための番号を与えられ、次の選挙の最初から継続することができます。最後の比較N、N-1、。ゼロ値の大きさ。与えられた関数の最大出力値を比較することができます。

コードは以下の通りであります:

#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);
}
公開された17元の記事 ウォンの賞賛1 ビュー3436

おすすめ

転載: blog.csdn.net/weixin_43983570/article/details/90381025