背包问题的贪心算法

 背包问题是一个经典的问题,到现在还没有多项式时间的算法去解决它.本文是背包问题的贪心算法,当然是一个非多项式算法.

 

#include <iostream>
#include 
<vector>
#include 
<algorithm>

using namespace std;

struct Treasure
{
    
int no;
    
int quantity;
    
int price;
    
int value;
}
;

bool is_great_than ( const Treasure & t1, const Treasure & t2 )

    
if ( t1.value > t2.value ) return true;
    
else return false;
}


struct ThiefBag
{
    
struct Got_Treasure
    
{
        
int no;
        
int quantity;
    }
;

    
int quantity_of_big;

    vector
< Got_Treasure > vgt;
}
;

int main ( int argc, char * argv[] )
{
    vector
< Treasure > vt;
    ThiefBag thief;
    ThiefBag::Got_Treasure gt;

    Treasure trea;
    
int quantity = 0;
    
int price;

    
for (int i = 0; i < 4++i) {
        cin 
>> quantity >> price;
        trea.no 
= i;
        trea.quantity 
= quantity;
        trea.price 
= price;
        trea.value 
= price / quantity;

        vt.push_back ( trea );
    }


    cin 
>> thief.quantity_of_big;

    sort ( vt.begin(), vt.end(), is_great_than );

    
for ( vector<Treasure>::iterator itr = vt.begin();
        itr 
!= vt.end() && thief.quantity_of_big > 0;
        
++ itr ) {
        
if ( (*itr).quantity >= thief.quantity_of_big ) {
            gt.no 
= (*itr).no;
            gt.quantity 
= thief.quantity_of_big;

            thief.vgt.push_back(gt);

            thief.quantity_of_big 
= 0;
            (
*itr).quantity -= thief.quantity_of_big;

            
break;
        }


        gt.no 
= (*itr).no;
        gt.quantity 
= (*itr).quantity;

        thief.vgt.push_back(gt);

        thief.quantity_of_big 
-= (*itr).quantity;
        (
*itr).quantity = 0;
    }


    cout 
<< "NO.   " << "quantity  " << endl;
    
for ( vector<ThiefBag::Got_Treasure>::iterator itr = thief.vgt.begin();
        itr 
!= thief.vgt.end(); ++ itr ) {
        cout 
<< (*itr).no << "     " << (*itr).quantity << endl;
    }


    system(
"pause");
    
return 0;
}
### 背包问题中的贪心算法 #### 部分背包问题贪心算法原理 部分背包问题是允许将物品分割成任意比例放入背包的一种变体。对于此类问题,可以采用贪心策略来解决。其核心思想是按照单位重量的价值(即 `value/weight`)对物品进行排序,并优先选取单位价值最高的物品填满背包直到无法再加入为止[^1]。 以下是具体实现方法: - 计算每件物品的单位价值 (`unit_value = value / weight`)。 - 将所有物品按单位价值降序排列。 - 依次尝试向背包中添加当前最高单位价值的物品,如果该物品能完全装下则全部装入;否则只装入一部分使得刚好达到背包容量上限。 这种做法能够保证每次操作都尽可能增加整体收益,在满足约束条件下获得最优解。 #### C语言实现示例 下面提供了一个基于上述思路的部分背包问题解决方案: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int value; int weight; } Item; // 比较函数用于qsort() 排序依据为单位价值从高到低 int compare(const void* a, const void* b){ double r1 = ((Item*)a)->value *1.0 /((Item*)a)->weight ; double r2 = ((Item*)b)->value *1.0 /((Item*)b)->weight ; if(r1<r2)return 1; if(r1>r2)return -1; return 0; } double fractionalKnapsack(Item items[], int n, int capacity){ qsort(items,n,sizeof(Item),compare); double totalValue=0.0f; for(int i=0;i<n;i++){ if(capacity >=items[i].weight ){ capacity -=items[i].weight ; // 容量减少 totalValue +=items[i].value;// 总价值提升 } else{ // 当前物品只能取走一部分 totalValue += (capacity *(double)items[i].value/items[i].weight ); break; } } return totalValue; } void main(){ Item arr[]={{60,10},{100,20},{120,30}}; int size = sizeof(arr)/sizeof(arr[0]); printf("Maximum Value in Knapsack : %.2lf\n",fractionalKnapsack(arr,size ,50)); } ``` 此程序通过结构体表示每个项目的数据成员包括它的值和权重。利用标准库里的快速排序功能实现了自定义比较器来进行预处理步骤——根据性价比排序列表项。最后遍历经过排序后的数组计算最终的最大可能获取总金额。 #### 应用场景分析 贪心算法适用于求解某些特定类型的优化问题,特别是那些可以通过局部最优选择逐步构建全局最佳方案的情况。然而需要注意的是,这种方法并不总是有效,尤其当面临整数型背包这类更复杂情形时,它往往得不到真正的最优点。因此实际开发过程中还需要考虑动态规划等其他技术手段加以补充完善[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值