【0-1问题】 金矿模型 java实现

问题来源: http://www.cnblogs.com/sdjl/articles/1274312.html

有一个国家,所有的国民都非常老实憨厚,某天他们在自己的国家发现了十座金矿,并且这十座金矿在地图上排成一条直线,国王知道这个消息后非常高兴,他希望能够把这些金子都挖出来造福国民,首先他把这些金矿按照在地图上的位置从西至东进行编号,依次为0、1、2、3、4、5、6、7、8、9,然后他命令他的手下去对每一座金矿进行勘测,以便知道挖取每一座金矿需要多少人力以及每座金矿能够挖出多少金子,然后动员国民都来挖金子。

       题目补充1:挖每一座金矿需要的人数是固定的,多一个人少一个人都不行。国王知道每个金矿各需要多少人手,金矿i需要的人数为peopleNeeded[i]。

       题目补充2:每一座金矿所挖出来的金子数是固定的,当第i座金矿有peopleNeeded[i]人去挖的话,就一定能恰好挖出gold[i]个金子。否则一个金子都挖不出来。

       题目补充3:开采一座金矿的人完成开采工作后,他们不会再次去开采其它金矿,因此一个人最多只能使用一次。

       题目补充4:国王在全国范围内仅招募到了10000名愿意为了国家去挖金子的人,因此这些人可能不够把所有的金子都挖出来,但是国王希望挖到的金子越多越好。

       题目补充5:这个国家的每一个人都很老实(包括国王),不会私吞任何金子,也不会弄虚作假,不会说谎话。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Created by Nevermore on 2016-04-14.
 */
public class test {
    public static void main(String[] args){
        /*10000人,10矿*/
//        ores.add(new Ore(1281,50));
//        ores.add(new Ore(4247,787));
//        ores.add(new Ore(1792,660));
//        ores.add(new Ore(1297,942));
//        ores.add(new Ore(2127,210));
//        ores.add(new Ore(4480,656));
//        ores.add(new Ore(2918,300));
//        ores.add(new Ore(2466,821));
//        ores.add(new Ore(4666,1000));
//        ores.add(new Ore(1928,139));

        /*100人,5矿*/
        ores.add(new Ore(77, 92));
        ores.add(new Ore(22, 22));
        ores.add(new Ore(29, 87));
        ores.add(new Ore(50, 46));
        ores.add(new Ore(99, 90));

        int totalgold = got(100,4,ores);
        System.out.println("totalgold ==  " + totalgold);
    }


    static int got(int member, int index, List<Ore> ores) {   //参数1:剩余人数   参数2:将要分析的矿的下标
        Ore now = ores.get(index);       //目前分析的金矿
        if (index > 0) {
            if (member < now.member) {   //当人数不足以挖当前矿的话,继续向下找
                return got(member, index - 1, ores);
            }//zhongyao
            int yes = now.gold + got(member - now.member, index - 1, ores);      //挖当前矿
            int no = got(member, index - 1, ores);                               //不挖当前矿 
            if (yes > no) {
                return yes;
            } else {
                return no;
            }
        } else if (member >= now.member) {
            return now.gold;
        } else {
            return 0;
        }
    }
}

/*金矿类*/ 
class Ore {
    public int member;
    public int gold;
    Ore(int a,int b){
        member=a;
        gold=b;
    }
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值