Greedy for Fractional Knapsack

部分背包(Fractional Knapsack)

按性价比排好序列

一个一个往进去装直到最后一个不能全装进去计算比例

JAVA

public class FractionalKnapsack {
        public static float[] GREEDY_KNAPSACK(int[] w,int W,int[] v)
    {
        int i;
        int n=w.length;//总共有多少个物品,用w.length/v.length都可以
        float[] x=new float[n];
        for(i=0;i<n;i++)
        {
            x[i]=0;//初始化
        }
        float c=W;//c是包剩余容量
        for(i=0;i<n;i++)
        {
            if(w[i]<=c)//如果第i个物品的重量<剩余容量
            {
                x[i]=1;//全部取出,比例百分百
                c=c-w[i];//改变剩余容量
            }
            else break;//跳出循环
        }
        if(i<n&&c>0)
            x[i]=c/w[i];//算出剩下能装的容量占这个物品的比例,也就是取出的比例
        return x;

    }
    public static void PRINTARRAY(float[] array) {
        System.out.print("{");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]);
            if (i < array.length - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("}");
    }
    public static void main(String[] args)
    {
        int [] A={65,20,30,60,40};
        int [] B={30,10,20,50,40};
        float [] x=GREEDY_KNAPSACK(B,100,A);
        PRINTARRAY(x);
    }

}

輸出:{1.0, 1.0, 1.0, 0.8, 0.0}

比例不是整數改爲用float;

性價比排序現為人爲排序,待修改

时间: 2024-10-07 06:09:45

Greedy for Fractional Knapsack的相关文章

算法导论 practice3

1. 0-1 knapsack problem Instance : weight capacity is 100 item weights values A 50 200 B 30 180 C 45 225 D 25 200 E 5 50 0-1背包问题有最优子结构.重叠子问题----用动态规划. I的值是---装了几个物品 J的值是---现在背包的容量 存的元素---现在的价值 令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为j(1<=j<=C)的背包中的物品的

【算法问题】0-1背包问题

0-1背包问题:有一个贼在偷窃一家商店时,发现有n件物品,第i件物品价值vi元,重wi磅,此处vi与wi都是整数.他希望带走的东西越值钱越好,但他的背包中至多只能装下W磅的东西,W为一整数.应该带走哪几样东西?这个问题之所以称为0-1背包,是因为每件物品或被带走:或被留下:小偷不能只带走某个物品的一部分或带走同一物品两次. 在分数(部分)背包问题(fractional knapsack problem)中,场景与上面问题一样,但是窃贼可以带走物品的一部分,而不必做出0-1的二分选择.可以把0-1

【USACO1.1.2】Greedy Gift Givers(map)

Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts of money. Each of these friends might or might not give some money to any or all of the other friends. Likewise, each friend might or might not receiv

USACO 1.1 Greedy Gift Givers

Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts of money. Each of these friends might or might not give some money to any or all of the other friends. Likewise, each friend might or might not receiv

1.1.4 PROB Greedy Gift Givers

Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts of money. Each of these friends might or might not give some money to any or all of the other friends. Likewise, each friend might or might not receiv

2018.2.25-26 algo part3 greedy algorithm

这周讲初级的greedy alorithm,greedy algorithm是一种算法思想,思路是每一步都做在当时看上去是最优的事情,那么很多步下来,最后得到的方案可能也是个比较不错的方案(虽然可能不是最优).之前接触过的knapsack problem和dijkstra's algorithm都是greedy algorithm的体现. 先讲的一个问题是scheduling application,就是说有一系列事务需要处理,每件事物有各自的优先级和处理时间,那么如何得到一个最优的schdul

2018.3.5-6 knapsack problem, sequence alignment and optimal binary search trees

这周继续dynamic programming,这三个算法都是dynamic programming的. knapsack problem有一种greedy的解法,虽然简单但是不保证正确,这里光头哥讲的是dynamic的解法.其实和上次那个max weight independent set的算法差不多,同样是每个物件都判断一遍有这个物件和没这个物件两种情况,用bottom-up的方法来解,然后得到一个最大的value值,这时因为没有得到具体的选择方案,所以最后还需要一部重构的步骤得到具体方案.

ZOJ 3794 Greedy Driver spfa

题意: 给定n个点,m条有向边,邮箱容量. 起点在1,终点在n,开始邮箱满油. 下面m行表示起点终点和这条边的耗油量(就是长度) 再下面给出一个数字m表示有P个加油站,可以免费加满油. 下面一行P个数字表示加油站的点标. 再下面一个整数Q 下面Q行 u v 表示在u点有销售站,可以卖掉邮箱里的任意数量的油,每以单位v元. 问跑到终点能获得最多多少元. 先求个每个点的最大剩余油量 f[i], 再把边反向,求每个点距离终点的最短路 dis[i]. 然后枚举一下每个销售点即可,( f[i] - dis

USACO Train 1.1.2 Greedy Gift Givers

这道题大意就是几个人互送礼物,让你求每个人的盈利. 原题给的样例数据: 5(人的个数.) =========(下面是人名,输出按照这顺序)davelauraowenvickamr ==========(下面是每个人的要给的人)dave200 3lauraowenvick ----------owen500 1dave ----------amr150 2vickowen -----------laura0 2amrvick ----------vick0 0 这题使用模拟算法就行了,就是注意输入