华为oj上的贩卖系统,找钱用背包法,通过。
import java.util.*;
class Good
{
final int price;
int number;
public Good(int price,int number)
{
this.price=price;
this.number=number;
}
}
class Box
{
private static int[] MONEY={1,2,5,10};
private int[] money_metrix;
private HashMap<String, Good> goods_map;
int put_rest;
int all_goods;
public Box() {
money_metrix=new int[4];
goods_map=new HashMap<String, Good>(6);
goods_map.put("A1", new Good(2, 0));
goods_map.put("A2", new Good(3, 0));
goods_map.put("A3", new Good(4, 0));
goods_map.put("A4", new Good(5, 0));
goods_map.put("A5", new Good(8, 0));
goods_map.put("A6", new Good(6, 0));
}
public void followCommand(String command)
{
String[] com=command.split("[ -]+");
switch(com[0].charAt(0))
{
case 'r':
{
int[] num=new int[10];
for(int i=0;i<10;i++)
{
num[i]=Integer.parseInt(com[i+1]);
}
opReset(num);
break;
}
case 'p':
{
opPay(Integer.parseInt(com[1]));
break;
}
case 'b':
{
opBuy(com[1]);
break;
}
case 'c':
{
opChange();
break;
}
case 'q':
{
opQuery(Integer.parseInt(com[1]));
break;
}
default:
}
}
private void opQuery(int option) {
Good a;
switch (option) {
case 0:
for(int i=1;i<=6;i++)
{
a=goods_map.get("A"+i);
System.out.println("A"+i+" "+a.price+" "+a.number);
}
break;
case 1:
for(int i=0;i<4;i++)
{
System.out.println(MONEY[i]+" yuan coin number="+money_metrix[i]);
}
break;
default:
System.out.println("E010:Parameter error");
break;
}
}
private void opChange() {
if(put_rest==0)
{
System.out.println("E009:Work failure");
}
else {
int i,count,j,tmp_money;
int[][] pull_metrix=new int[put_rest+1][4];
int[] bag=new int[put_rest+1];
bag[0]=0;
for(i=1;i<=put_rest;i++)
{
bag[i]=10000;
}
for(i=0;i<4;i++)
{
count=money_metrix[i];
tmp_money=MONEY[i];
while(count-->0)
{
for(j=put_rest;j>=tmp_money;j--)
{
if(bag[j]>bag[j-tmp_money]+1)
{
pull_metrix[j][0]=pull_metrix[j-tmp_money][0];
pull_metrix[j][1]=pull_metrix[j-tmp_money][1];
pull_metrix[j][2]=pull_metrix[j-tmp_money][2];
pull_metrix[j][3]=pull_metrix[j-tmp_money][3];
pull_metrix[j][i]++;
bag[j]=bag[j-tmp_money]+1;
}
}
}
}
count=put_rest;
while(count>0)
{
if(bag[count]<100)
{
put_rest=0;
for(i=0;i<4;i++)
{
money_metrix[i]-=pull_metrix[count][i];
}
System.out.println("1 yuan coin number="+pull_metrix[count][0]);
System.out.println("2 yuan coin number="+pull_metrix[count][1]);
System.out.println("5 yuan coin number="+pull_metrix[count][2]);
System.out.println("10 yuan coin number="+pull_metrix[count][3]);
break;
}
else {
count--;
}
}
}
}
private void opBuy(String buy_name) {
Good good=goods_map.get(buy_name);
if(good==null)
{
System.out.println("E006:Goods does not exist");
}
else if(good.number==0)
{
System.out.println("E007:The goods sold out");
}
else if (put_rest<good.price) {
System.out.println("E008:Lack of balance");
}
else {
good.number--;
all_goods--;
put_rest-=good.price;
System.out.println("S003:Buy success,balance="+put_rest);
}
}
private void opPay(int money) {
if(money!=1&&money!=2&&money!=5&&money!=10)
{
System.out.println("E002:Denomination error");
}
else if((money==5||money==10)&&money_metrix[0]+2*money_metrix[1]<money)
{
System.out.println("E003:Change is not enough, pay fail");
}
else if(put_rest+money>10)
{
System.out.println("E004:Pay the balance is beyond the scope biggest");
}
else if(all_goods==0)
{
System.out.println("E005:All the goods sold out");
}
else {
put_rest+=money;
switch(money)
{
case 1:money_metrix[0]++;break;
case 2:money_metrix[1]++;break;
case 5:money_metrix[2]++;break;
case 10:money_metrix[3]++;break;
}
System.out.println("S002:Pay success,balance="+put_rest);
}
}
private void opReset(int[] num) {
goods_map.get("A1").number=num[0];
goods_map.get("A2").number=num[1];
goods_map.get("A3").number=num[2];
goods_map.get("A4").number=num[3];
goods_map.get("A5").number=num[4];
goods_map.get("A6").number=num[5];
money_metrix[0]=num[6];
money_metrix[1]=num[7];
money_metrix[2]=num[8];
money_metrix[3]=num[9];
all_goods=num[0]+num[1]+num[2]+num[3]+num[4]+num[5];
put_rest=0;
System.out.println("S001:Initialization is successful");
}
}
public class Main
{
public static void main(String[] args){
Box box=new Box();
Scanner scan=new Scanner(System.in);
String[] command=scan.nextLine().split(";");
for(int c=0;c<command.length;c++)
{
box.followCommand(command[c]);
}
scan.close();
}
}