案例4:百元购物问题
问题描述
妈妈给了小明100元,让小明到超市去买东西。超市里可乐每瓶5元,牛奶每瓶8元,矿泉水每瓶3元。如果要求每种商品至少买一个,请问最多有多少种购买方案呢?
实现思路
每种商品都是至少要买一个,但是每种商品最多可以购买的数量是可以计算出来的,就是100元除以商品单价的数量,所以每种商品最多可以购买的数量如下:
商品名称 购买最小数量/个 购买最大数量/个 商品总价/元
可乐 1 100/5 100
牛奶 1 100/8 100
汽水 1 100/3 100
在获取了各类商品的可购买数量范围之后,即可针对这三种商品的数量进行排列组合,这三种商品的购买数量需要满足一个条件就是总价不能超过100元,即遵守如下公式:
5*i + 8* j + 3* k<=1 00
其中,i为可乐的数量,j为牛奶的数量,k为汽水的数量。
剩下的工作就是按照排列组合的方式来实现这三种商品数量的组合,每种组合都是一个可能的方案,具体的情况如下:
商品组合 可乐 牛奶 汽水
1 1 1 1国开电大答案请进:opzy.net或请联系微信:1095258436
2 2 1 1
3 2 2 1
…………………………………………………
N i j j
上述的N代表最大购买数量组合数,i、j、k分别代表三种商品的购买数量。基于上述思路通过程序计算最终的组合数量和组合情况。
在程序中,可以通过循环的方式来实现输出各种排列组合的情况,每种商品都是一个循环,一共是三个循环机制。循环的初始条件是1,结束条件是达到了可乐/牛奶/汽水的购买最大限额,然后循环结束。在这些循环中还有一个约束条件,就是当购买的商品满足总金额不超过100时,才是有效的。
具体的实现代码如下:
完整的代码可以参考chapter3-workflow目录下的BuyThing100.java。
int planCount = 0; //方案数量
for (int i=1; i<=100/5; i++) {
for (int j=1; j<=100/8; j++) {
for (int k=1; k<=100/3; k++) {
if (5*i + 8*j + 3*k<=100) { //金额在100元之内
planCount++; //方案数量自增
System.out.println(“Plan:” + planCount + “, 可乐:” + i + “, 牛奶:” + j + “,汽水:” + k);
}
}
}
}