背包算法

程序实现功能: 有几种重量不同的石头,现在需要从这几种石头中搬指定重量的石头,随意组合,如何才能搬的个数最少。(一定要搬这个重量的石头,不能多也不能少)。如何石头的组合不能得到这个重量就可以不管
using System;
using System.Collections.Generic;
using System.Text;

namespace beibao
{
    class Program
    {
        static void Main(string[] args)
        {
            int targetWeight = 1342;
            List<int> typeList = new List<int>();
            typeList.Add(100);
            typeList.Add(70);
            typeList.Add(40);
            typeList.Add(10);
            typeList.Add(8);
            typeList.Sort();
            typeList.Reverse();
            Stack<BeiBaoResult> result = GetBeiBaoResult(targetWeight,typeList);

            foreach (BeiBaoResult item in result)
            {
                Console.WriteLine(item.TypeWeight + ":" + item.TypeCount + "个");
            }

        }

        public static Stack<BeiBaoResult> GetBeiBaoResult(int targetWeight,List<int> typeList)
        {
            Stack<BeiBaoResult> result = new Stack<BeiBaoResult>();

            for (int i = 0; i < typeList.Count; i++)
            {
                int remainWeight; //剩余重量
                if (i == 0)
                {
                    remainWeight = targetWeight;
                }
                else
                {
                    remainWeight = result.Peek().RemainWeight;
                }

                BeiBaoResult beiBaoResult = new BeiBaoResult();
                beiBaoResult.TypeWeight = typeList[i];
                beiBaoResult.TypeCount = remainWeight / typeList[i];
                beiBaoResult.RemainWeight = remainWeight % typeList[i];
                result.Push(beiBaoResult);
                if (beiBaoResult.RemainWeight == 0)
                {
                    return result;
                }
            }

            while (result.Count>1)
            {
                result.Pop();
                BeiBaoResult lastBeiBaoItem = result.Peek();

                while (lastBeiBaoItem.TypeCount > 0)
                {
                    lastBeiBaoItem.TypeCount = lastBeiBaoItem.TypeCount - 1;
                    lastBeiBaoItem.RemainWeight = lastBeiBaoItem.RemainWeight + lastBeiBaoItem.TypeWeight;

                    List<int> typeList2 = new List<int>();
                    typeList2 = typeList.GetRange(result.Count, typeList.Count - result.Count);

                    Stack<BeiBaoResult> beiBaoResult2 = GetBeiBaoResult(lastBeiBaoItem.RemainWeight, typeList2);

                    if (beiBaoResult2.Peek().RemainWeight == 0)
                    {
                        while (beiBaoResult2.Count > 0)
                        {
                            result.Push(beiBaoResult2.Pop());
                        }
                        return result;
                    }
                }                                

            }

            return result;
        }

        /// <summary>
        /// 背包结果项
        /// </summary>
        public class BeiBaoResult
        {
            //种类重量
            public int TypeWeight;

            //种类个数
            public int TypeCount;

            //剩余重量
            public int RemainWeight;
        }
    }
}
时间: 2024-10-12 05:34:30

背包算法的相关文章

信息安全-4:公钥密码体制之背包算法[原创]

转发注明出处:http://www.cnblogs.com/0zcl/p/6111686.html 前言 本来我是想学RSA算法的,但发现太难了,不是我能理解的,于是我先看教材前面的背包算法.不出意料的话会在下一篇博客介绍下RSA算法! 背包问题介绍: 给定一些物体,每个物体有不同的重量,是否有可能将这些物体放入一个背包,使背包的重量等于一个给定的值. 背包算法为第一个推广的公开密钥加密算法. 虽然后来发现这个算法不安全,但仍值得研究,因为它表示了如何将NP完全问题用于公开密钥算法(好吧,这个我

01背包算法的理解

01背包问题: 有N件物品和一个最大重量限制为V的背包.第i件物品的重量是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的重量总和不超过V,且价值总和最大.每个物品只有1份,且不可分割 看了01背包算法,言简意赅,但理解起来头昏脑胀,不得要领.尝试解释下对该算法的理解,加深记忆. 假设最优解已经存在,怎么判断一个物品i是否在背包里?  简单,只要知道, 1.c[i]是否大于V, 2.F[i-1][V-c[i]],即没有i物品的情况下,最大重量限制为V-c[i]的最优解. 3.F[i

背包算法解决一道华为面试题

闲来无事,看到了一篇文章,华为面试题,题目如下: 有两个数组a,b,大小都为n,数组元素的值任意,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小 网址是http://bbs.chinaunix.net/thread-855126-1-1.html这个. 估计多数人想到的都是先sort,再交叉,或者一条龙什么的,包括我.后来一想不对啊,如果前面的都是个位数,最后一个是999怎么办? 抱着学习的态度一页一页往下翻,好多人都是在提出来自己想法,但是我拿我这个999验

用coffee和socket.io实现的01背包算法

先说说我为什么写这些吧 当程序猿太苦逼了,真的,时间久了,真没有搬砖的成就感高,好歹人家能盖栋楼(身材也能练得不错),咱们指不定哪天来个熊孩子把硬盘格了就啥也没了. 这学期明显没把心放在前端上--汗啊,将来还想吃着口饭呢,但是这学期绝对没休息,只是忙了很多可能很多人认为无聊的事. 因为这学期无聊事太多了,耽误了很多,也让导师很失望,自己也很自卑,整理一下调调心态. 因为很多是针对作业的奇葩想法,所以,作业嘛,不糊弄就不是作业了,还希望大家多多批评. 兴许因为哪篇文章能解决工作呢. 我想试试Mar

背包算法练习--求小于某数字的数组最大和:

////背包算法练习--求小于某数字的数组最大和: var bestS = {val:0,str:""}; var LIMIT ; Array.prototype.sum = function(){ var s = 0; for(var i = 0;i < this.length;i++){ s+= this[i]; } return s; } function f(bagArr){ var arrS = bagArr.sum(); if(arrS < LIMIT){ be

01背包算法

转:01背包问题 动态规划的基本思想: 将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算.通常用来求最优解,且最优解的局部也是最优的.求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解. 动态规划算法可分解成从先到后的4个步骤: 1. 描述一个最优解的结构,寻找子问题,对问题进行划分. 2. 定义状态.往往将和子问题相关的各个变量的一组取值定义为一个状态.某个状态的值就是这个子问题的解(若有k个变量,一般用K维的数组存储各个状态下的解,并可根    据这个数组记录

贪心思想之部分背包算法

贪心的思想:通过每一步都找最优解决问题.因为每一步最优,最后是最优的概率很大. 部分背包的思想就是:把最值钱的往包里装,装得越多越好.可见设计算法的人好贪啊,嘿嘿~ 样例: n种东西,重量是Mi,价值是Vi,单价就是两者之比Pi.C为小包包的容量.最后算出的结果是对应取Xi放到包中. 代码如下: #include<iostream> using namespace std; float *m,*v,*p,*x; float c;//背包容量 int n,h; void TaskInitial(

使用单调队列优化的 O(nm) 多重背包算法

我搜索了一下,找到了一篇很好的博客,讲的挺详细:链接. 解析 多重背包的最原始的状态转移方程: 令 c[i] = min(num[i], j / v[i]) f[i][j] = max(f[i-1][j-k*v[i]] + k*w[i])     (1 <= k <= c[i])  这里的 k 是指取第 i 种物品 k 件. 如果令 a = j / v[i] , b = j % v[i] 那么 j = a * v[i] + b. 这里用 k 表示的意义改变, k 表示取第 i 种物品的件数比

java实现背包算法(0-1背包问题)

0-1背包的问题 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问题的名称来源于如何选择最合适的物品放置于给定背包中. 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v]=max{ f[i-1][v], f