最大工作量问题新的解法(不会证明)

原创 2015年07月08日 15:51:24

上次说到的那个问题,是用暴力破解,但是我电脑跑到30位的时候就跑不动了,现在我想出一种新的算法,经过验证是对的,但是我无法证明这种算法的正确性,请数学大神帮我证明无比感谢,我再重新描述一下问题:

         小明的导师给小明分配任务,每天都有不为0的任务量,如20,40,10,20,但是小明有心脏有问题,最多连续工作两天就必须休息一天,这让小明的导师很头疼,请问如果给定任务列表,小明怎么安排才能做最多的工作,求小明最多干多少活。

我的思路是这样的:每一天只有两种状态,一种是工作,一种是休息,我们就取到当天为止最大的工作量,所以要记录小明已经连续工作的天数,如果小明已经连续工作零天,那么当天必须工作才能获取的最大值,(我们把工作的顺序记录下来1表示工作,0表示休息,最终以便求和);如果小明已经工作一天那么,就让小明今天也工作才能达到最大值;如果说小明已经连续工作了两天,那我们先把今天休息,然后算出最大工作量然后记录下来,然后如果今天选择工作的话,那么就必须昨天休息,或者是前天休息,才能让今天继续工作,所以分别把昨天休息,和前天休息的最大工作量算出来,然后比较这三种工作量,取最大的工作量,然后把对应最大工作量的顺序记录下来。然后再进行下一天的决策。

        注意上面是我递推的思路,即(d代表工作天数,max代表当前最大工作量,work代表当天的工作量)

        if d<=1

        max=max+    work;

        else

        max=max{  3中决策的最大工作量 };


需要注意的是,每次要决策完后一定要把决策的工作序列记录下来,以便后面调用,如  1101等等,这个算法可以说是一种动态规划算法,也可以说是一种贪心算法,现在就是没有证明这种算法的正确性,请大神证明:我的实现如下(java)


public class Main3 {


static class Node{
boolean[] all=null;
int index=0;
int days=0;

public Node(int length){
all=new boolean[length];
}

public int sum(int[] workList){
int sum=0;
for(int i=0;i<index;i++){
if(all[i]){
  sum+=workList[i];
}
}
return sum;
}

public static Node max(Node a,Node b,int[] workList){
return a.sum(workList)>b.sum(workList)?a:b;
}

public static Node max(Node a,Node b,Node c,int[] workList){
Node temp=max(a,b,workList);
return max(temp,c,workList);
}

public void copy(Node node){
for(int i=0;i<index;i++){
node.all[i]=all[i];
node.index=index;
node.days=days;
}
}
}

public static int getMax(int[] workList){
if(workList.length<=2){
int sum=0;
for(Integer temp:workList){
sum+=temp;
}
return sum;
}else{
Node pre=new Node(workList.length);
pre.all[0]=true;
pre.all[1]=true;
pre.index=2;
pre.days=2;
Node now=null;
for(int i=2;i<workList.length;i++){

if(pre.days==2){
//这一天休息创建一个Node
Node a=new Node(workList.length);
pre.copy(a);
a.days=0;
a.all[a.index]=false;
a.index++;
//这一天上班,但是让昨天不上班
Node b=new Node(workList.length);
pre.copy(b);
   b.days=1;
   b.all[b.index]=true;
   b.all[b.index-1]=false;
   b.index++;
   //这一天上班,但是让前天天不上班
   Node c=new Node(workList.length);
   pre.copy(c);
   c.all[c.index]=true;
   c.all[c.index-2]=false;
c.index++;
//选取最大值
now=Node.max(a, b, c, workList);
}else{
//如果这已经工作天数不是2,那么今天工作肯定达到目前最大值
Node d=new Node(workList.length);
pre.copy(d);
d.days=pre.days+1;
d.all[d.index]=true;
d.index=pre.index+1;
now=d;
}
pre=now;
}
return now.sum(workList);
}
}

public static void main(String[] args) {
int[] workList=new int[]{2000,10,2000,2000};
System.out.println(getMax(workList));
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

学习区块链的基础知识--工作量证明

作者认为最快的学习区块链的方式是自己创建一个,就跟随作者用Python来创建一个区块链。对数字货币的崛起感到新奇的我们,并且想知道其背后的技术——区块链是怎样实现的。但是完全搞懂区块链并非易事,我喜欢...
  • caimouse
  • caimouse
  • 2018年01月23日 11:15
  • 471

区块链在中国(4):比特币的工作量证明

比特币需要每个block(区块)证明在创建它们的过程中投入了足够都的工作量,从而确保那些想篡改历史区块信息的恶意节点必须要付出更多工作量的代价,而不是只是修改一条记录那么简单——工作量证明。 将区块...
  • BlueCloudMatrix
  • BlueCloudMatrix
  • 2016年08月17日 13:38
  • 4907

POW工作量证明机制

工作证明(Proof Of Work,简称POW),顾名思义,即工作量的证明。通常来说只能从结果证明,因为监测工作过程通常是繁琐与低效的。 比特币在Block的生成过程中使用了POW机制,一...
  • h363659487
  • h363659487
  • 2017年06月12日 10:11
  • 1464

工作量证明算法

区块链中一种工作量证明算法#!/usr/bin/env python # example of proof-of-work algorithm import hashlib import time m...
  • jeason29
  • jeason29
  • 2016年05月31日 17:34
  • 934

Proof of work - 工作量证明

http://blog.csdn.net/hacode/article/details/8750037 简述: 在垃圾邮件防范和DOS系统中,可能会用到“工作量证明...
  • sirnuo
  • sirnuo
  • 2013年12月17日 15:04
  • 3787

工作量评估

为什么必须首先做规模估计? 如何做好软件估计? 软件项目的工作量估算方法 七种场景下的软件工作量估算步骤 为什么...
  • bamboolsu
  • bamboolsu
  • 2015年02月25日 17:26
  • 1094

Proof&nbsp;of&nbsp;work&nbsp;-&nbsp;工作量证明

简述: 在垃圾邮件防范和DOS系统中,可能会用到“工作量证明”这个工具。简而言之,就是一份证明,它能够说明你为此工作了一定量的时间了。   当然,这只是对于一方而言的,游戏的另一方应该有一个很简单的...
  • qq53016353
  • qq53016353
  • 2016年04月18日 21:49
  • 260

最大工作量问题

关于最大工作量的问题,暴力解决
  • sxiaobei
  • sxiaobei
  • 2015年07月08日 00:44
  • 798

用 Go 构建一个区块链 -- Part 2: 工作量证明

在 前面一文 中,我们构造了一个非常简单的数据结构,这个数据结构也是整个区块链数据库的核心。目前所完成的区块链原型,已经可以通过链式关系把区块相互关联起来:每个块都被连接到前一个块。但是,我们实现的区...
  • simple_the_best
  • simple_the_best
  • 2017年09月26日 17:16
  • 843

一文来了解比特币及区块链技术核心

引言:IBM总裁兼CEO金妮·罗曼提曾谈到,区块链技术远比人工智能更加重要。为什么这么说呢?我们知道区块链技术是支撑比特币存在的根本技术,这是个非常了不起的概念,可以包含使用比特币的任何一个消息。有了...
  • DP29syM41zyGndVF
  • DP29syM41zyGndVF
  • 2018年01月17日 00:00
  • 107
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大工作量问题新的解法(不会证明)
举报原因:
原因补充:

(最多只允许输入30个字)