贪心算法:0-1背包

“0-1 背包问题

  • 问题描述
  •  			有一容积有限的背包(容积为V)
    
  •  			现在有n个物品,每个物品都有自己的价值和提及
    
  •  			如何知道一个较优的策略,使得能够放进背包里价值之和最大的的物品
    

 解题的思路

先把各个物品的价值密度求出来 价值/体积
之后通过贪新的思路优先那密度最高的,直到装不下为止

 程序模型的建立

  • 利用贪新的思路
  • 每次选择密度大的哪一个

 数据结构的选用

  • 利用数组进行存储
  • 之后在数组中i进行排序

 程序设计流程

  • 存入数据
  • 进行密度计算
  • 进行排序
  • 进行贪心

 程序设计伪码算法

get a sorted
	while(容量小于选择所有物品的体积值之和)
		选择价值密度最大的哪一个

 源程序编码清单

#include<iostream>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std ;
bool comp(pair<int ,double> a  , pair<int ,double> b ) ;
int main(void)
{
	int n ;
	scanf("%d",&n) ;
	int content ;
	scanf("%d",&content) ;
	vector< pair<int , double> > a ;
	a.resize(n) ;
	int tem ; 
	for(vector< pair<int ,double> >::iterator it = a.begin() ; it !=a.end() ;it++ )
	{
		scanf("%d",&tem) ;
		(*it).first = tem ;// capibility it cost ;
		scanf("%d",&tem) ;
		(*it).second = tem ;//srcond if value ;
		(*it).second = (*it).second/(*it).first  ;//the ρof things ; 
	}
	sort(a.begin(),a.end(),comp) ;
	int cnt = 0 ;
	for(vector< pair<int ,double> > :: iterator it = a.begin() ;it != a.end() ;it++)
	{
			if(cnt+ (*it).first <=   content)
			{
				printf("%d %f\n", (*it).first ,(*it).second) ;
			}
			cnt+=(*it).first ;
	} 
	
	
}
bool comp(pair<int ,double> a  , pair<int ,double> b ) 
{
	if(a.second > b.second)
	{
		return true ;
		
	}
	else
	{
		return false ;
	}
}

 程序输入、输出

输入
	7 80
	10 7 
	20 8 
	30 9
	40 12
	4 7 
	14 6
	5 7
输出
	4
	5
	10
	14
	20

输入输出文件或程序运行结果截图
在这里插入图片描述
 时间与空间复杂度分析

  • 时间复杂度:n

 程序使用说明
 总结与完善

猜你喜欢

转载自blog.csdn.net/weixin_42222917/article/details/83189576