同學(xué)幫他侄兒?jiǎn)栁乙粋€(gè)問(wèn)題:
資源:
1、小明的錢可以購(gòu)買50瓶汽水。
2、老板搞促銷,兩個(gè)空汽水瓶子可以換一瓶汽水。
問(wèn):小明最多能喝多少瓶汽水?
開(kāi)始還楞了一下, 現(xiàn)在的小學(xué)題目還真不簡(jiǎn)單。不過(guò)馬上給出答案:
先是50瓶,然后用50個(gè)空瓶換來(lái)25瓶,喝完后用25個(gè)空瓶換12瓶再多個(gè)空瓶,
喝完后用13個(gè)空瓶換6瓶,然后是7個(gè)空瓶換3瓶,然后是4個(gè)空瓶換2瓶,
然后是2個(gè)空瓶換1瓶,最后問(wèn)老板借1個(gè)空瓶,再用2個(gè)空瓶換1瓶,
剩下來(lái)那個(gè)空瓶還給老板。所以喝到50+25+12+6+3+2+1+1=100
不過(guò)最近在學(xué)習(xí)規(guī)則引擎, 于是就想到了怎么用規(guī)則引擎來(lái)實(shí)現(xiàn)。
我的想法是:
1: 假設(shè)汽水一元一瓶, 則小明最初有50元。
2: 如果兜里有超過(guò)一元錢, 則買一瓶汽水喝, 此時(shí):
錢減少一元,同時(shí)擁有的空瓶增加一個(gè)。
3: 如果擁有至少兩個(gè)空瓶, 則兩個(gè)空瓶賣給老板, 兜里的錢加一。
根據(jù)如上想法, 有了如下規(guī)則引擎的實(shí)現(xiàn)的實(shí)現(xiàn)(Drool):
java文件SodaWater.java:
- package org.drools.examples;
- import java.io.InputStreamReader;
- import java.io.Reader;
- import org.drools.FactHandle;
- import org.drools.RuleBase;
- import org.drools.RuleBaseFactory;
- import org.drools.StatefulSession;
- import org.drools.WorkingMemory;
- import org.drools.compiler.PackageBuilder;
- import org.drools.rule.Package;
- public class SodaWater
- {
- public static final void main(String[] args) throws Exception {
- final PackageBuilder builder = new PackageBuilder();
- builder.addPackageFromDrl( new InputStreamReader( SodaWater.class.getResourceAsStream( "SodaWater.drl" ) ) );
- final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
- ruleBase.addPackage( builder.getPackage() );
- final StatefulSession session = ruleBase.newStatefulSession();
- Customer customer = new Customer( "XiaoMing", 50);
- session.insert(customer);
- session.fireAllRules();
- }
- public static class Customer
- {
- private String name;
- private int money;
- private int drinkSum;
- private int blankCup;
- public Customer(String name, int money)
- {
- this.name = name;
- this.money = money;
- this.drinkSum = 0;
- this.blankCup = 0;
- }
- public int getMoney()
- {
- return money;
- }
- public void setMoney(int money)
- {
- this.money = money;
- }
- public int getBlankCup()
- {
- return blankCup;
- }
- public void setBlankCup(int blankCup)
- {
- this.blankCup = blankCup;
- }
- public int getDrinkSum()
- {
- return drinkSum;
- }
- public void setDrinkSum(int drinkSum)
- {
- this.drinkSum = drinkSum;
- }
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- }
- }
rule文件:
- package org.drools.examples
- dialect "mvel"
- import org.drools.examples.SodaWater.Customer
- rule "buy a soda water and drink"
- when
- $c : Customer(money > 0, $m:money, $b:blankCup, $d:drinkSum)
- then
- $c.money = $m - 1;
- $c.blankCup = $b + 1;
- $c.drinkSum = $d + 1;
- System.out.println( "Customer " + $c.name + " now buy a soda water and drink: money=" + $c.money + " and blankCup=" + $c.blankCup);
- update($c);
- end
- rule "sale blank cup and get money"
- when
- $c : Customer(blankCup > 1, $b:blankCup, $m:money )
- then
- $c.blankCup = $b - 2;
- $c.money = $m + 1;
- System.out.println("Customer " + $c.name + " now sale 2 cups and get money: money=" + $c.money + ", blankCup=" + $c.blankCup);
- update($c);
- end
- rule "finish drink"
- no-loop true
- dialect "java"
- when
- $c : Customer(blankCup < 2, money == 0)
- then
- System.out.println( "Customer " + $c.getName() + " finished drink, and drink number is " + $c.getDrinkSum() + " blankCup=" + $c.getBlankCup());
- end
運(yùn)行結(jié)果如下:
Customer XiaoMing now buy a soda water and drink: money=49 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=2
Customer XiaoMing now sale 2 cups and get money: money=49, blankCup=0
Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=47 and blankCup=2
...
Customer XiaoMing now buy a soda water and drink: money=1 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=2
Customer XiaoMing now sale 2 cups and get money: money=1, blankCup=0
Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=1
Customer XiaoMing finished drink, and drink number is 99 blankCup=1
不過(guò)小明最后手上還有最后一個(gè)瓶子, 計(jì)算機(jī)只能到此了。
向老板借一個(gè)瓶子換一瓶汽水,喝完在還一個(gè)空瓶子,估計(jì)就是人類智慧來(lái)。
此程序需要drools的jar包,具體可見(jiàn):
http://lcllcl987.iteye.com/blog/254381
看看大家還有什么好的算法。