阿里巴巴与四十大盗——背包问题

C++源码:

#include<iostream>
#include<algorithm>
#include<conio.h>
const int M=10000005;
using namespace std;
struct three{
	double w;//每个宝物的重量
	double v;//每个宝物的价值
	double p;//性价比
}s[M];
bool cmp(three a,three b)
{
	return a.p>b.p;//根据宝物的单位价值从大到小排序
}
int main()
{
	int n;//表示有n个宝物
	double m;//表示毛驴的承载能力
	cout<<"请输入宝物的数量n及毛驴的承载能力m"<<endl;
	cin>>n>>m;
	cout<<"请输入每个宝物的重量及价值,用空格分开"<<endl;
	for(int i=0;i<n;i++)
	{
		cin>>s[i].w>>s[i].v;
		s[i].p=s[i].v/s[i].w;//每个宝物的单位价值
	}
	sort(s,s+n,cmp);
	double sum=0.0;//表示贪心运走宝物的价值之和
	for(int i=0;i<n;i++)
	{
		if(m>s[i].w)//表示宝物的重量在毛驴的承载能力之内
		{
			m-=s[i].w;
			sum+=s[i].v;
		}
		else{
			sum+=m*s[i].p;//部分装入
			break;
		}
	}
	cout<<"装入宝物的最大价值maximumv value="<<sum<<endl;
	getch();
	return 0;
}

python源码:

w=[]#宝物的重量
v=[]#宝物的价值
p=[]#宝物的性价比
sum=0.0#表示贪心运走宝物的价值之和
m=float(input("毛驴的承载能力m="))
n=int(input("宝库中已有的宝物数量n="))
print("请输入每个宝物的重量w及宝物的价值v,输入时用空格分开:")
for i in range(n):
    a, b = (input("该宝物w&v:").split())
    w.append(round(float(a),1))
    v.append(round(float(b),1))
    p.append(round(v[i]/w[i],1))#每个宝物的单位价值
treasure=[[p[i],w[i],v[i]] for i in range(n)]
print("每一个宝物所对应的性价比、重量、价值:\n",treasure)
treasure.sort(reverse=True)
print("按照性价比从大到小排序后每一个宝物所对应的性价比、重量、价值:\n",treasure)
#print(treasure[1][0])
for i in range(n):
    if m>treasure[i][1]:
        m-=treasure[i][1]
        sum+=treasure[i][2]
    else:
        sum+=m*treasure[i][0]#最后一个宝物部分装入
        break
print("阿里巴巴的毛驴能装载的宝物的最大价值maxinum value=",sum)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古剑诛仙

你的鼓励是我创造的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值