算法---背包问题

什么是背包问题呢?

就是一个特定载重的背包,给你一个数据表,求解其最优的结果,那么很显然喽---》这就是一个优化问题

那么我们具体一点!

这个背包载重8千克;

李子:4KG 4500元;

苹果:5KG 5700元;

草莓:1KG 1100元;

橘子:2KG 2250元;

甜瓜:6KG 6700元;

那,我们使用动态规划,使用每步都要求是最优解的办法,就可以解出来,这个和数学建模算法里面一样,还要一些差不多的东西,今天我们就先看一下这个题的da代码;c++;

#include  
#include  
#include  
#include
using namespace std;

#define L 8
#define N 5
#define M 1
/*使用动态规划求解,就是每步都选取最优解,然后直到最后*/
struct body {
	char name[20];
	int size;
	int price;
};
typedef struct body aaa;
int main(void) {
	int item[L + 1] = { 0 };//存放放入顺序
	int value[L + 1] = { 0 };//存放价格
	int n, i, s, p;//p是剩余的质量(背包剩余)
	aaa a[]{ {"李子",4,4500},{"苹果",5,5700},{"橘子",2,2250},{"草莓",1,1100},{"甜瓜",6,6700} };
	for (i = 0; i < N; i++) {//对第一个李子,进行满装比较
		for (s = a[i].size; s <= L; s++) {
			p = s - a[i].size;
			//n为,剩余空间的价值+上新的价值
			n = value[p] + a[i].price;
			//如果n的价值,大于了它本身,就替换,并且,记录下加入的顺序;
			if (n > value[s]) {
				value[s] = n; 
				item[s] = i;
			}
		}
	}
	cout << "物品" << "\t" << "价格" << "\n";
	//倒着输出,装入的水果量,与价值
	for (i = L; i >= M; i = i - a[item[i]].size) {
		cout << a[item[i]].name << "\t" << a[item[i]].price << endl;
	}
	cout << "合计" << "\t" << value[L] << endl;
	system("pause");
	return 0;
}

 

你可能感兴趣的:(编程内功)