贪心算法之部分背包

题目为:
在这里插入图片描述
运用贪心算法思想,及局部最优,则整体最优

  • c++代码如下:
//饮品混合 
#include<bits/stdc++.h>
using namespace std;
const int M=510;
struct good{
 double price;
 double weight;
 double ratio; //性价比 
};
good s[M];

bool comp(const good x,const good y)
{
 return x.ratio>y.ratio;
}
main()
{
 int i=0, ans = 0, c, n;
 cout<<"输入容器的体积和商品的数量 :"; 
 cin>>c>>n;  //容器的体积 
 cout<<"分别输入每个商品价格和对应的体积:\n";
 for(int j=0;j<n;j++)
 {
  cin>>s[j].price>>s[j].weight; s[j].ratio=s[j].price/ s[j].weight; 
 }
 sort(s,s+n,comp); //安性价比从大到小排序 
 while(c>0 && i<= n)
 {
  if(s[i].weight<=c) 
  {
   ans = ans+s[i].price; c = c-s[i].weight;
  }else{
   ans = ans+s[i].price*c/s[i].weight;
   c = 0;
  }
  i = i+1;
 } 
 cout<<"混合饮品的最高价格:"<<ans;
 return 0;
}

运行结果

输入容器的体积和商品的数量 :800 5
分别输入每个商品价格和对应的体积:
60 600
10 250
36 200
16 100
45 300
的最高价格:117
--------------------------------

注意: 我在使用c++的sort()函数时,对结构体数组排序时,数组下标必须是从0开始,否则会出错,找了半天,终于发现问题所在!

1
2
贪心策略:一般步骤
观察问题特征,构造贪心选择
假设最优方案,通过替换证明
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值