博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数的乘方,简单背包,组合
阅读量:6250 次
发布时间:2019-06-22

本文共 2171 字,大约阅读时间需要 7 分钟。

 

数的乘方

  1. 2的8次方
  2. 4的4次方
  3. 8的2此方

利用以上思路来减少乘法次数,3次乘法就可以完成运算

注意点:用模来判断乘方的奇偶性,如果是奇数则再乘以x

public static int Power(int x, int y){    if (y == 0)        return 1;    else if (y == 1)        return x;    else if (y == 2)    {        return x * x;    }    else if (y % 2 == 0)    {        y = y / 2;        return Power(x * x, y);    }    else        return x * Power(x * x, y / 2);} static void Main(string[] args) {     Console.WriteLine(Power(2, 8)); }

简单背包问题

从11,8,7,6,5凑满20放到包里

  1. 从包中取出与20比较,如果可以容纳的话就继续加
  2. 否则的话则放弃该元素试图放下一个元素.
  3. 内部数组到了尽头需要索引+1继续尝试填充
  4. 如果到了数组尽头还是没凑满,那么尝试从头开始(索引+1)即头元素11换成8

 

public static void knapsack3(int[] values, int total){    var limit = 0;    var length = values.Length;    for (int i = 0; i < length; i++)    {        limit = values[i];        int inner = i + 1;        for (var index = inner; index < length; index++)        {            var weight = limit + values[index];            if (total == weight)                return;            else if (total > weight)                limit += values[index];            if (index == (length - 1) && inner < length)            {                limit = values[i];                index = inner++;            }        }    }}

递归版本

分成两个部分的循环

public static int knapsack(int[] values, int limit, int start, int inside){    var length = values.Length;    if (start == length) return limit;    var temp = limit;    for (int i = start; i < length; i++)    {        if (inside == 1)        {            //inner loop            Console.Write(string.Format("{0},", values[i]));            if (limit - values[i] == 0)            {                Console.WriteLine("success");                return 0;            }            if (limit - values[i] > 0)                limit -= values[i];        }        else        {            //outer loop            Console.WriteLine(string.Format("{0},", values[i]));            if (0 == knapsack(values, limit - values[i], i + 1, 1))                break;        }    }    if (inside == 1)    {        Console.WriteLine();        knapsack(values, temp, start + 1, 1);    }    return limit;}

test

static void Main(string[] args){    int[] values = {11,8,7,6,5 };    knapsack(values, 20, 0,0);}

组合

看此贴

转载地址:http://tmusa.baihongyu.com/

你可能感兴趣的文章
【原创】C#通用权限管理-程序安全检查,这些你一定要考虑到位
查看>>
Ubuntu完全教程,让你成为Ubuntu高手!
查看>>
vue父子通信的基本使用
查看>>
jquery.cookie 介绍 和 用法
查看>>
[CI] 使用Jenkins自动编译部署web应用
查看>>
SVN与TortoiseSVN实战:补丁详解
查看>>
Centes7 使用 xshell 登陆
查看>>
TestNG源代码分析:依赖管理的实现
查看>>
VMWare 安装时报错 tools-windows.msi failed报错解决办法
查看>>
java一些面试题
查看>>
如何使用dll和lib
查看>>
干货型up主
查看>>
文件与二进制流互转
查看>>
获取页面中所有dropdownlist类型控件
查看>>
【转自ITPUB】SYNONYM关于underlying table权限的小小发现
查看>>
halcon图像合并(贴图到指定位置)
查看>>
stark组件(2):提取公共视图函数、URL分发和设置别名
查看>>
android——使用Interceptor设置缓存来给服务器减负
查看>>
样式独立性的解决方案
查看>>
刷leetcode是什么样的体验?【转】
查看>>