【算法】贪心策略实现部分背包问题

1.概述

      部分背包问题与0-1背包问题的根本区别在于部分背包问题在选择物品时可以选择物品的其中一部分(比如黄金,钻石等选择的时候可以对其进行切割).

2.算法思想

贪心法的基本思路:

——从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。

该算法存在问题:

1. 不能保证求得的最后解是最佳的;

2. 不能用来求最大或最小解问题;

3. 只能求满足某些约束条件的可行解的范围。

实现该算法的过程:

 

Begin 从问题的某一初始解出发;

while 能朝给定总目标前进一步 do

     求出可行解的一个解元素;

由所有解元素组合成问题的一个可行解

3.代码实现

#include<iostream>
using namespace std;

struct Node {
	int weight;
	int value;
};

int main() {
	int n = 0, m = 0;
	while (cin >> n >> m) {
		int maxValue = 0;
		int residualCapacity = m;

		Node* node = new Node[n];
		for (int i = 0; i < n; ++i) {
			cin >> node[i].weight;
			cin >> node[i].value;
		}

		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < n; ++j) {
				if (node[i].value / node[i].weight
						< node[j].value / node[j].weight) {
					swap(node[i], node[j]);
				}
			}

			if (residualCapacity >= node[i].weight) {
				residualCapacity = residualCapacity - node[i].weight;
				maxValue = maxValue + node[i].value;
			} else if (residualCapacity > 0) {
				maxValue = maxValue
						+ node[i].value / node[i].weight * residualCapacity;
				break;
			} else {
				break;
			}
		}

		cout << maxValue << endl;

		delete[] node;
	}

	return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值