最优装载(贪心)

描述:有一批集装箱要装上一艘载重量为C的轮船。其中集装箱i的重量为wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。

贪心算法之最优装载

给出n个物体,第i个物体的重量为wi。
选择尽量多的物体,使得总重量不超过C。
注意:这个地方每个物体是不可再分割的整体。
思路:
先把所有物体按重量排序(从小到大排序) ,
然后贪心选择重量比较小的物体直到所选物体的总重量超过所允许的最大重量C 。一般选择是从最小的开始,所以先要排序 

第一种方法(容器)

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    int c;  //轮船的载重量
    cout<<"轮船的载重量: ";
    cin>>c;
    int n;  //集装箱个数
    cout<<"集装箱个数: ";
    cin>>n;
    vector <int> v(n);//定义一个容器v(n),其类型为int·
    cout<<"物品质量:";
    for(int i=0;i<n;i++)
       cin>>v[i];
    sort(v.begin(),v.end());//从小到大排序
    int all=0;  //最多能装的集装箱个数
    int cp=c;    //当前剩余载重量
    for(int i=0;i<n;i++)
    {
        if(cp<=c&&v[i]<=cp)
        {
            all++;
            cp-=v[i];
        }
        if(cp<v[i])  break;
    }
    cout<<"最多可装入的个数:"<<all<<endl;
    cout<<"最终承载量:"<<c-cp<<endl;
    return 0;
}

第二种方法

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5
 6 int main()
 7 {
 8     int i,j,c,n;//分别为测试个数、集装箱个数
 9     float weight[1000];//集装箱重量
10     float load;//轮船载重量
11     cin>>c;
12     for(i=0;i<c;i++)
13     {
14           cin>>n>>load;
15                for(j=0;j<n;j++)
16           cin>>weight[j];
17           sort(weight,n+weight);
18           //开始装载
19           int count=0;
20           float sum=0.0;
21           for(int k=0;k<n;k++)
22           {
23               if(load>=weight[k])
24               {
25                  sum=sum+weight[k];
26                  load=load-weight[k];
27                  count++;
28               }
29               else
30               break;
31
32           }
33           cout<<count<<" "<<sum<<endl;
34         }
35
36
39     return 0;
40
41
42 }

原文地址:https://www.cnblogs.com/creative-work/p/9192608.html

时间: 2024-10-12 17:53:01

最优装载(贪心)的相关文章

最优装载

最优装载 贪心算法 一问题描述 二问题分析 三代码实现 package loading; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; public class bin { public static void main(String[] args) throws

贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解.它所做的每一个选择都是当前状态下局部最好选择.从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质:贪心选择性质和最优子结构性质. 1.贪心选择性质 贪心选择性质是 指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.与动态规划算法的不同之处是贪心算法只依赖在当前状态下做出最优选择,然后再去解做出这个选择后产生的相应的子问题.贪心算法依赖于以往做出的选择,但是绝不依赖未来做出的选择.所以贪心算法是自顶向下解决问题

贪心算法:最优装载问题

/*----------------------------------------------------- 给出n个物体,第i个物体的重量为wi. 选择尽量多的物体,使得总重量不超过C. 输入: n和C以及n个整数表示的wi. 输出: 按照输入物体的顺序输出n个用空格分隔的Y或N. Y表示该物体被选中,N表示不被选中. 最后一行输出所选中的物体的个数num和总重量w,用空格分隔. 注意:这个地方每个物体是不可再分割的整体. 思路: 先把所有物体按重量排序(从小到大排序) , 然后贪心选择重量

贪心算法一:最优装载问题

1.基本思想: 贪心算法是通过一系列的选择来得到问题的解,它所做的选择都是当前情况下最优的选择,即贪心算法并不考虑整体最优,而考虑的是当前情况下的局部最优,即贪心选择. 2.贪心算法的两个性质: 1)贪心选择性质:所求解的问题的整体最优解可以通过一系列局部最优的选择来,即贪心选择达到.贪心选择所依赖的是以前所做过的选择,而对以后所做的选择没有关系. 2)最优子结构性质:一个问题的最优解包含其子问题的最优解. 3.贪心算法与动态规划的区别: 动态规划是通过自底向上的方式解决子问题,贪心算法是通过自

贪心算法之最优装载问题

问题描述: 给出n个物体,第i个物体的重量是Wi,选择尽量多的物体,使得总重量不超过C. 问题分析: 这是一个很典型的用贪心算法的题目.要想让装的物体越多,自然装的最轻的物体就越多.因此可以对物体的重量由小到大进行排序,然后依次装载即可.这就体现了贪心算法只顾眼前,但却可以得到最优解. 解决问题:  代码如下 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> //为了引入memcpy 4 /

最优装载问题_贪心

一.  问题描述    有一批集装箱要装上一艘载重为C的轮船.其中集装箱i的重量为Wi.最优装载问题要去确定在装载体积不受限制的情况下,将极可能多的集装箱装上轮船. 二.  解题思路及所选算法策略的可行性分析 使用贪心算法. 问题描述为: max∑Xi,∑WiXi<=C,Xi∈{0,1}   1<=i<=n 其中,变量Xi=0表示不装入集装箱i,Xi=1表示装入集装箱i. 贪心选择性质: 设集装箱已依其重量从小到大排序,(X1,X2,…,Xn)是最优装问题的一个最优解.又设k=min{i

0-1 背包问题、背包问题、最优装载问题、哈夫曼编码,这几个问题的思想是什么?

0-1背包问题: 给定n种物品和一个背包.物品i的重量是Wi,其价值为Vi,背包的容量为C.应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包.不能将物品i装入背包多次,也不能只装入部分的物品i. 背包问题: 与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n. 解决方法:求每个物品的价值重量比,即价值/重量.然后添加价值重量比最大的物品,添加结束如果

回溯法--无优化 最优装载问题

//#include "stdafx.h" // 回溯法,解空间分为排列数和子集树,前者是不同节点顺序的排列,后者是一个(0,1,...)的向量子集// 最大装载问题,是一个NP问题,目前只计算第一艘船,属于子集树// 有几个货物,子集树就有几层,当前题目为5层// 我感觉递归还是太过于精巧和经凑,很难挖空心思自己写出来,多熟悉别人现有的程序是一个好办法. #include<iostream>using namespace std; template<class T&

回溯算法 - 最优装载

(1)问题描述:有一批共 n 个集装箱要装上 2 艘载重量分别为 capacity1 和 capacity2 的轮船,其中集装箱 i 的重量为 wi,且装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这 2 艘轮船.如果有,找出一种装载方案. 例如:当 n = 3, capacity1 = capacity2= 50, 且 w = [10, 40, 40] 时,则可以将集装箱 1 和 2 装到第一艘轮船上,而将集装箱 3 装到第二艘轮船上:如果 w = [20, 40, 40],则无法