背包问题 组合问题中的贪心法(C++实现)

问题:给定n个物品和一个容量为c的背包,重量是weight,价值是value,背包问题(Knapsack Problem)是如何选择装入背包,使得装入背包中物品总价值最大。可以将物品的一部分放入背包,但不可以重复装入。

为简单起见,物品排序已经按照单价降序排列。

代码如下:

double KnapSack(int weight[],int value[],int n,int c){
	double x[n] = {0},maxValue = 0;//物品可部分装入
	int i;
	for(i=0;weight[i]<c;i++){
		x[i] = 1;//装入
		maxValue += value[i];
		c -= weight[i];
	}
	x[i] = (double)c/weight[i];
	maxValue += x[i] * value[i];
	return maxValue;
}

测试:

int main(){
	int weight[3] = {30,10,20};
	int value[3] = {120,50,60};
	int maxvalue = KnapSack(weight,value,3,50);
	cout<<"背包可装物品最大价值之和为"<<maxvalue<<endl;
	return 0;
}

输出如下:

背包可装物品最大价值之和为200

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
背包问题(Knapsack Problem)是一个经典的组合优化问题,通常涉及到给定一组物品,每个物品有自己的重量和价值,目标是在不超过给定总重量的前提下,选择物品使得总价值最大。在C++贪心算法可以用于解决某些特定类型的背包问题,比如0-1背包问题。 对于0-1背包问题,贪心策略通常是每次选择当前单位重量下价值最高的物品放入背包。这种方法称为“价值优先”策略,直到达到背包容量为止。然而,这种贪心策略并不总是最优解,因为某些情况下可能会牺牲部分重量换得更高的整体价值。例如,考虑物品A(价值5,重量1)和B(价值4,重量2),按照价值优先选择会先拿A,但如果再放B比单独放A的价值更高,这时就需要权衡取舍。 以下是使用贪心法的一个简单示例代码: ```cpp #include <vector> using namespace std; pair<int, int> knapSack(int W, vector<pair<int, int>>& items) { sort(items.begin(), items.end(), [](const pair<int, int>& a, const pair<int, int>& b) { return (a.second / a.first) > (b.second / b.first); }); int totalValue = 0; for (const auto& item : items) { if (W >= item.first) { W -= item.first; totalValue += item.second; } else { totalValue += (W * item.second) / item.first; break; } } return make_pair(W, totalValue); } int main() { int capacity = 10; // 背包容量 vector<pair<int, int>> items = {{60, 10}, {100, 20}, {120, 30}}; // 物品列表 auto result = knapSack(capacity, items); cout << "背包的最大价值是:" << result.second << endl; cout << "剩余的背包容量是:" << result.first << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值