背包问题(可拆背包)
来源:互联网 发布:js实现word预览 编辑:程序博客网 时间:2024/06/05 21:58
背包问题(可拆背包)
已知n种物品和一个可容纳c重量的背包,物品i的重量用数组w[i]来表示,产生的效益用p[i]来表示装包物品可拆,即可装每种物品的一部分。显然物品i的一部分x[i]放入背包中的重量为x[i]*w[i],可产生的效益为x[i]*p[i]。(0<x[i]<1)
设计如何装包可使装包所得效益最大?
思路:贪心算法设计
要是整体效益最大,即目标函数最大,每次选择单位重量效益最高的装包,这就是贪心策略。各物品按单位重量的效益进行降序排列,
从单位重量效益最高的开始装包,知道包满为止。
#include<stdio.h>
#define N 100
int main()
{
float p[N],w[N],x[N]={0},c,cw,s,h;//c为包的容量,cw为装入物品后包剩余的容量,s为价值量
int i,j,n;
printf("输入物品的个数n\n");//n为物品的个数
scanf("%d",&n);
printf("输入书包的容量c\n") ;
scanf("%f",&c);
for(i=1;i<=n;i++)
{
printf("输入各个商品的重量和价值\n");
scanf("%f %f",&w[i],&p[i]);
}
for(i=1;i<=n-1;i++) //冒泡排序的思想
for(j=i+1;j<=n;j++)
{
if(p[i]/w[i]<p[j]/w[j])
{
h=p[i];
p[i]=p[j];
p[j]=h;
h=w[i];
w[i]=w[j];
w[j]=h;
}
}
cw=c;
s=0;
for(i=1;i<=n;i++)
{
if(w[i]>cw)
{
x[i]=(float)(cw/w[i]);
s=s+p[i]*x[i];
break;
}
if(w[i]<=cw)
{x[i]=1.0;
cw=cw-w[i];
s=s+p[i];
}
}
for(i=1;i<=n;i++)
{
if(x[i]==1.0)
printf("\n装入质量为%5.1f 效益为%5.1f的物品"q,w[i],p[i]);
else if(x[i]<1&&x[i]>0)
printf("\n装入质量为%5.1f 效益为%5.1f的物品百分之%5.1f",w[i],p[i],x[i]*100);
else break;
}
printf("\n最大收益为%7.1f",s);
}
0 0
- 背包问题(可拆背包)
- 背包问题(背包可划分)贪心算法
- 贪心算法实现背包问题(背包可拆分)
- 背包问题(物体可分割)
- 可拆分物品背包问题
- 背包问题(分组背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包(01背包、完全背包、多重背包)问题总结
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包 + 完全背包 + 多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包问题模板(01背包,完全背包,多重背包)
- 经典背包问题----(01背包、完全背包、多重背包)
- 背包问题总结第一讲——可拆分背包
- 贪心法求解背包问题(部分背包 物品可分)
- 用贪心算法解决背包问题(物品可分割)
- nyoj 106 背包问题 (dp或贪心都可)
- GBDT算法原理深入解析
- A. Checking the Calendar
- Android ScrollView自动滚屏或者直接滚屏到底部
- 第二章 视觉特性和彩色电视信号
- USB 描述符详细解析,来自老外网站,比协议描述清晰
- 背包问题(可拆背包)
- Memcached的常见命令介绍
- MVC框架自己封装开启超神之路(上) 3-1配置加载类
- Android学习之路--四大组件--Service
- Spring ConcurrentReferenceHashMap简单测试
- 数据结构::线索化二叉树
- Spring MVC 跳转(1)-转发
- windows录音教程
- 30、(知识篇)SpringMVC07 Spring 自定义视图