贪心背包问题

来源:互联网 发布:道路规划设计软件 编辑:程序博客网 时间:2024/05/02 05:47

Problem Description

有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
物品  A  B  C  D  E  F  G
重量  35  30  60  50  40  10  25
价值  10  40  30  50  35  40  30
分析:
目标函数: ∑pi最大
约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)

Input

首先输入一个正整数T,表示有T组测试数据,接下来是T组数据,每组两行,分别为7个物品的重量和价值。

Output

每组数据的背包能装的最大总价值,精确到小数点后三位。

Sample Input

135  30  60  50  40  10  2510  40  30  50  35  40  30


Sample Output

190.625

分析:题目比较简单,就直接码代码了一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。

Code:
#include<iostream>#include <iomanip> using namespace std;void sort(float a[],float b[],float c[],int n){for(int d = n/2;d >= 1;d = d/2){for(int i = d + 1;i <= n;i++){a[0] = a[i];b[0] = b[i];c[0] = c[i];for(int j = i - d;j > 0&&a[0] < a[j];j = j - d){a[j + d] = a[j];b[j + d] = b[j];c[j + d] = c[j];}a[j + d] = a[0];b[j + d] = b[0];c[j + d] = c[0];}}}float getSum(float a[],int n){float sum = 0;for(int i = n;i <= 7;i++)sum = sum + a[i];return sum;}int main(){int n;cin>>n;while(n--){int i,j,k;float sum=0;float zl[8],jz[8],xjb[8];for(i = 1;i < 8;i++)cin>>zl[i];for(j = 1;j < 8;j++)cin>>jz[j];for(k = 1;k < 8;k++)xjb[k] = jz[k]/zl[k];sort(xjb,zl,jz,7);int temp = 7;while(getSum(zl,temp) <= 150)temp--;for(int t = 7;t > temp;t--)sum = sum + jz[t];sum = sum + (150 - getSum(zl,temp + 1)) / zl[temp] * jz[temp];cout<<setiosflags(ios::fixed)<<setprecision (3)<<sum<<endl;}return 0;}

原创粉丝点击