算法学习-(三)贪婪算法

来源:互联网 发布:淘宝页面设计代码 编辑:程序博客网 时间:2024/05/19 14:18


贪婪算法

例1:部分背包问题

题目描述
给定一个最大容量为m的背包和n种问题,有食盐、白糖、大米等。已知第i种食品最多有wi公斤,其价值为vi元/公斤,编程确定一个装货方案,使得装入背包中的所有食品的总价值最大。
输入输出格式
输入格式:
第一行,两个整数m,n,表示背包容量和食品种类。
接下去n行,为每种食品的价值和数量
输出格式:
价值:%d   取:%d
输入输出样例
输入样例#1:
5 3
3 2
5 4
6 3
输出样例#1:
价值:6,  单价:2.00,取:3
价值:3,  单价:1.50,取:2

总价值:9

代码:

#include<iostream>using namespace std;int main(){int w[1000],v[1000];//w为质量,v为价值,r为价值与质量的比float r[1000];//r为价值与质量的比int n;//物品的数量int m;//背包的容量 int sum=0;//得到的价值int i, j;scanf("%d %d",&m,&n);//输入背包总量和数量for(i=0;i<n;i++){scanf("%d %d",&v[i],&w[i]);//输入价值和重量}for(i=0; i<n; i++){r[i]=v[i]*1.0/w[i];//单价钱}for(i=1;i<n;i++){//按单价排序for(j=0;j<n-i;j++){if(r[j]<r[j+1]){int x;float y;y=r[j];r[j]=r[j+1];r[j+1]=y;x=w[j];w[j]=w[j+1];w[j+1]=x;x=v[j];v[j]=v[j+1];v[j+1]=x;} } }i=0;while(m>0){if(w[i]<=m){m-=w[i];printf("价值:%d,单价:%.2f,取:%d\n",v[i],r[i],w[i]);sum+=v[i];i++;}else{printf("价值:%d,单价:%.2f,取:%d\n",v[i],r[i],m);sum+=r[i]*m;m=0;}}printf("总价值:%d\n", sum);return 0;}





0 0
原创粉丝点击