算法学习:贪心解部分背包问题

本文介绍了一种解决部分背包问题的贪心算法,并通过具体代码实现展示了如何按照单位重量价值进行排序来找到最优解。

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

部分背包(贪心)

今天复习贪心,看老师的讲义关于贪心的正确性的证明,直接把我给看傻了,先写个代码解一下题好啦~~
感觉自己写的代码笨笨的,应该有更好的方法,以后慢慢研究,先把这个最初级的记录下来:

/*
部分背包问题
贪心策略求解 
*/
#include<iostream>
#define N 3//背包个数
#define M 20//背包最大承载重量 
using namespace std;
double w[N] = {18, 15, 10};
double p[N] = {25, 24, 15};
double v[N];//单位重量的价值 
//按照单位重量的价值大小排序
//这里用冒泡排序,正好之前没写冒泡 
void swap(double &a, double &b){
    double temp = a;
    a = b;
    b = temp;
}
void bubsort(double *num,int n, double *w, double *p)
{
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n-i-1;j++)
        {
            if(num[j+1] < num[j]){
                swap(num[j+1], num[j]);
                swap(w[j+1], w[j]);
                swap(p[j+1], p[j]);
            }
        }
    }
}
int main()
{
    for(int i = 0; i < N; i++)
    {
        v[i] = (double)p[i] / w[i];
    } 
    bubsort(v,N,w,p);
    int m = M;
    int i = N - 1;
    double sum = 0;//记录最大效益值 
    while(m > 0 && i >= 0 && w[i] <= m)
    {   
        m -= w[i];
        sum += p[i];
        i--;
    }
    if(m > 0)
    {
        sum += m * v[i];
    }
    cout << sum << endl;
    return 0;
} 

之后的算法中好多还会提及到贪心,到时候可以比较一下~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值