贪心背包问题
2013-04-11 23:28
134 查看
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
1 35 30 60 50 40 10 25 10 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;
}
相关文章推荐
- 纯C语言:贪心部分背包问题源码
- 贪心算法之背包问题
- 十:贪心算法-背包问题
- 用贪心算法背包问题,Java实现
- 算法分析与设计2017-2-背包问题的贪心算法
- 背包问题的贪心算法
- NYOJ 106 背包问题 (贪心)
- 贪心算法解决部分背包问题
- 可以用贪心解决的背包问题
- NYOJ-背包问题(贪心)
- NYOJ题目106-背包问题(贪心)
- 部分背包问题的贪心算法正确性证明
- 贪心策略的基本内容和背包问题
- 贪心算法之背包问题
- 南阳理工acm 106背包问题(排序+贪心)
- 证明01分数背包问题具有贪心选择性质
- 贪心法——活动选择问题和背包问题
- 【南理oj】106 - 背包问题(贪心,经典)
- NYOJ-106 背包问题(贪心)
- 背包问题的贪心算法求解