背包算法(C++实现)

该博客介绍了一个使用动态规划解决01背包问题的C++程序。用户输入物品数量、质量和价值,程序会按重量和价值对物品排序,然后根据背包的最大承受重量计算最优装载方案。程序通过二维数组存储每个物品的装载情况,输出每一步的装载结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<stdlib.h>
using namespace std;
#define MaxNumber 100
int *Weight = new int[MaxNumber];
int *Value = new int[MaxNumber];
int MaxWeight;
void sort(int length) {
	int num = 0;
	for (int i = 0; i < length; i++)
	{
		for (int j = i; j < length; j++)
		{
			if (Weight[i] > Weight[j]) {
				num = Weight[i];
				Weight[i] = Weight[j];
				Weight[j] = num;

				num = Value[i];
				Value[i] = Value[j];
				Value[j] = num;
			}
			if (Weight[i] == Weight[j]) {
				if (Value[i] <Value[j]) {
					num = Weight[i];
					Weight[i] = Weight[j];
					Weight[j] = num;

					num = Value[i];
					Value[i] = Value[j];
					Value[j] = num;
				}
			}
		}
	}
}


int main() {
	cout << "输入物品数量:";
	int length = 0;
	cin >> length;
	cout << endl;
	cout << "输入物品的质量及其价值" << endl;
	for (int i = 0; i < length; i++)
	{
		cin >> Weight[i];
		cin >> Value[i];
	}
	cout << "----------------------------------" << endl;
	cout << "            数据输入完毕          " << endl;
	cout << "----------------------------------" << endl;
	sort(length);
	for (int i = 0; i < length; i++)
	{
		cout << "物品" << i + 1 << "号: ";
		cout << "质量:" << Weight[i] << "、价值:" << Value[i] << endl;
	}
	cout << "----------------------------------" << endl;
	cout << "            数据录入完毕          " << endl;
	cout << "----------------------------------" << endl;
	cout << "输入背包最大承受重量:";
	cin >> MaxWeight;
	int *Form = new int[MaxNumber];
	cout << "最大承受重量:";
	for (int j = 0; j < MaxWeight; j++)
	{
		cout <<"" << j+1 << "   ";
	}
	cout << endl;
	for (int i = 0; i < length; i++)
	{	
		int totall = 0;
		for (int q = 0; q <= i; q++)
		{
			totall += Weight[q];
		}
		for (int j = 1; j <=MaxWeight; j++)
		{
			Form[j-1] = 0;
		}
		for (int j = 1; j <=MaxWeight; j++)
		{	
			for (int m = 0; m <=i; m++)
			{	
				if (totall <=j) {
					if (totall == j) {
						int all = 0;
						for (int l = 0; l <= i; l++) {
							all += Value[l];
						}
						Form[j - 1] = all;
					}
					else {
						Form[j - 1] = Form[j - 2];
					}
				}
				else {
					if (Weight[m] >j) {
						if (m == 0) {
							Form[j-1] = Value[m];
						}
						else {
							break;
						}
					}
					else {
						if (Weight[m] == j) {
							if (m == 0) {
								Form[j - 1] = Value[m];
							}
							else {
								if (Value[m] > Form[j - 2]) {
									Form[j - 1] = Value[m]>Form[j-1]?Value[m]:Form[j-1];
								}
								else {
									Form[j - 1] = Form[j - 2];
								}
							}
						}
						else {
							if (m == 0) {
								Form[j - 1] = Value[m];
							}
							else {
								if (Form[j-1 - Weight[m]] + Value[m] > Form[j - 2]) {
									Form[j-1] = Form[j-1 - Weight[m]] + Value[m];
								}
								else {
									Form[j-1] = Form[j - 2];
								}
								
							}
						}
					}
				}
			}
		}
		cout<< "   第" << i + 1 << "个物品:";
		for (int j = 0; j < MaxWeight; j++)
		{
			cout << Form[j] << "   ";
		}
		cout << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值