C++实现算法设计——贪心算法(背包问题)

引言:网上的代码多多少少都有点问题,所以自己写了一个。

问题:贪心算法背包问题
假设有n种宝物,每种宝物i对应价值为vi,重量wi,毛驴只能运载重量为m的宝物。每种宝物只能拿1件,可分割。如何使得毛驴运走的宝物价值最大?

贪心策略:
1)每次挑选价值最大的宝物装入背包,得到的结果是否最优?
2)每次挑选重量最小的宝物装入背包,得到的结果是否最优?
3)每次挑选单位重量价值最大的宝物,价值是否最高?

算法设计
贪心算法背包问题
1)数据结构及初始化。

  • 计算性价比
  • 结构体item用于存储宝物的重量、价值和性价比
  • 变量sum用于存储毛驴当前能够运走的最大价值
  • 按照性价比进行降序排序

2)贪心策略:
每次挑选性价比最大的宝物

C++实现算法设计——贪心算法(背包问题)_第1张图片

C++实现算法设计——贪心算法(背包问题)_第2张图片

实现代码:

#include
#include
using namespace std;
typedef struct item_type
{
    char name;
    float weight;
    float value;
    float per_item_value;
    float rate;//使用率
} item;
bool cmp(item &a, item &b)
{
    return a.per_item_value > b.per_item_value;
}

int main()
{
    int n;//N个物品
    float c;//背包容量为c
    cout << "输入物品件数和背包容量:" << endl;
    cin >> n >> c;
    cout << "依次输入每件物品的价值和重量:" << endl;
    item *baowu;
    baowu = new item[n];
    for (int i = 0; i < n; i++)
    {
        baowu[i].name = 65 + i;
        cin >> baowu[i].value >> baowu[i].weight;
        baowu[i].per_item_value = baowu[i].value / baowu[i].weight;//计算性价比
        baowu[i].rate = 0;//初始化使用率
    }
    sort(baowu, baowu + n, cmp);
    float sum = 0;
    int j = 0;
    for (j = 0; j < n; j++)
    {
        if (baowu[j].weight <= c)
        {
            baowu[j].rate = 1;
            sum += baowu[j].value;
            c -= baowu[j].weight;
            cout << "重量为:" << baowu[j].weight << "价值为:" << baowu[j].value << "的物品被放入了背包,放入比例为:" << baowu[j].rate << endl;
        }
        else
            break;
    }
    //物品没装完
    if (j < n)
    {
        baowu[j].rate = c / baowu[j].weight;
        c -= baowu[j].rate * baowu[j].weight;
        sum += baowu[j].rate * baowu[j].value;
        cout << "重量为:" << baowu[j].weight << "价值为:" << baowu[j].value << "的物品被放入了背包,放入比例为:" << baowu[j].rate << endl;
        cout << "背包剩余容量为:" << c;
        cout << "总价值:" << sum;
    }
}

 C++实现算法设计——贪心算法(背包问题)_第3张图片

 请注意C++中结构体typedef struct / struct的使用区别,具体可百度!

 请点个免费的赞吧!

你可能感兴趣的:(算法,贪心算法,c++)