“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
程序使用说明
总结与完善