部分背包(贪心)
今天复习贪心,看老师的讲义关于贪心的正确性的证明,直接把我给看傻了,先写个代码解一下题好啦~~
感觉自己写的代码笨笨的,应该有更好的方法,以后慢慢研究,先把这个最初级的记录下来:
/*
部分背包问题
贪心策略求解
*/
#include<iostream>
#define N 3//背包个数
#define M 20//背包最大承载重量
using namespace std;
double w[N] = {18, 15, 10};
double p[N] = {25, 24, 15};
double v[N];//单位重量的价值
//按照单位重量的价值大小排序
//这里用冒泡排序,正好之前没写冒泡
void swap(double &a, double &b){
double temp = a;
a = b;
b = temp;
}
void bubsort(double *num,int n, double *w, double *p)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n-i-1;j++)
{
if(num[j+1] < num[j]){
swap(num[j+1], num[j]);
swap(w[j+1], w[j]);
swap(p[j+1], p[j]);
}
}
}
}
int main()
{
for(int i = 0; i < N; i++)
{
v[i] = (double)p[i] / w[i];
}
bubsort(v,N,w,p);
int m = M;
int i = N - 1;
double sum = 0;//记录最大效益值
while(m > 0 && i >= 0 && w[i] <= m)
{
m -= w[i];
sum += p[i];
i--;
}
if(m > 0)
{
sum += m * v[i];
}
cout << sum << endl;
return 0;
}
之后的算法中好多还会提及到贪心,到时候可以比较一下~