問題描述 張超來到了超市購物。 每個物品都有價格,正好趕上商店推出促銷方案。就是把許多東西一起買更便宜(保證優(yōu)惠方案一定比原價便宜)。物品要買正好的個數(shù),而且不能為了便宜而買不需要的物品。 張超拿到了優(yōu)惠方案,和需要購買的物品清單,當然想求出最小的花費。他是信息學(xué)選手,自然地想到寫個程序解決問題。 輸入格式 第一行促銷物品的種類數(shù)(0 <= s <= 99)。 第二行…第s+1 行每一行都用幾個整數(shù)來表示一種促銷方式。 第一個整數(shù) n (1 <= n <= 5),表示這種優(yōu)惠方式由 n 種商品組成。 后面 n 對整數(shù) c 和 k 表示 k (1 <= k <= 5)個編號為 c (1 <= c <= 999)的商品共同構(gòu)成這種方案。 最后的整數(shù) p 表示這種優(yōu)惠的優(yōu)惠價(1 <= p <= 9999)。也就是把當前的方案中的物品全買需要的價格。 第 s+2 行這行一個整數(shù)b (0 <= b <= 5),表示需要購買 b 種不同的商品。 第 s+3 行…第 s+b+2 行這 b 行中的每一行包括三個整數(shù):c ,k ,和 p 。 C 表示唯一的商品編號(1 <= c <= 999), k 表示需要購買的 c 商品的數(shù)量(1 <= k <= 5)。 p 表示 c 商品的原價(1 <= p <= 999)。 最多購買 5*5=25 個商品。 輸出格式 一個整數(shù)ans,表示需要花的最小費用 樣例輸入 2 1 7 3 5 2 7 1 8 2 10 2 7 3 2 8 2 5 樣例輸出 14
import java.util.Hashtable;
import java.util.Scanner;
public class Main {//促銷購物private plan plan[];private Hashtable<Integer, Integer> ha=new Hashtable<Integer, Integer>();private static int pl[][],n,m;private Node t[][][][][][];private static boolean b[];public void setT(int a,int b,int c,int d,int e,int f) {t=new Node[a][b][c][d][e][f];}public void setPlan(int n) {plan=new plan[n];}public static void main(String[] args) {// TODO Auto-generated method stubScanner sc=new Scanner(System.in);Main ps=new Main();int i,j;n=Integer.parseInt(sc.next());b=new boolean[n];ps.setPlan(n);for(i=0;i<n;i++){ps.plan[i]=ps.new plan();m=Integer.parseInt(sc.next());ps.plan[i].n=m;ps.plan[i].p=new int[m][2];for(j=0;j<m;j++){ps.plan[i].p[j][0]=Integer.parseInt(sc.next());ps.plan[i].p[j][1]=Integer.parseInt(sc.next());}ps.plan[i].cost=Integer.parseInt(sc.next());}m=Integer.parseInt(sc.next());pl=new int[5][3];for(i=0;i<m;i++){pl[i][0]=Integer.parseInt(sc.next());pl[i][1]=Integer.parseInt(sc.next());pl[i][2]=Integer.parseInt(sc.next());ps.ha.put(pl[i][0],i);}ps.setT(n, pl[0][1]+1, pl[1][1]+1, pl[2][1]+1, pl[3][1]+1, pl[4][1]+1);if(n!=0)i=fina(0,pl[0][1],pl[1][1],pl[2][1],pl[3][1],pl[4][1],ps);else{i=0;for(j=0;j<m;j++)i+=pl[j][1]*pl[j][2];}System.out.println(i);}private static int fina(int x, int a1, int a2, int a3, int a4, int a5,Main ps) {// TODO Auto-generated method stubif(ps.t[x][a1][a2][a3][a4][a5]!=null)return ps.t[x][a1][a2][a3][a4][a5].n;else{ps.t[x][a1][a2][a3][a4][a5]=ps.new Node();if(b[x]){if(x==n-1)return ps.t[x][a1][a2][a3][a4][a5].n=a1*pl[0][2]+a2*pl[1][2]+a3*pl[2][2]+a4*pl[3][2]+a5*pl[4][2];else return ps.t[x][a1][a2][a3][a4][a5].n=fina(x+1, a1, a2, a3, a4, a5, ps);}else{int i,c[],y;c=new int[5];c[0]=a1;c[1]=a2;c[2]=a3;c[3]=a4;c[4]=a5;for(i=0;i<ps.plan[x].n;i++){if(!ps.ha.containsKey(ps.plan[x].p[i][0])){b[x]=true;if(x==n-1)return ps.t[x][a1][a2][a3][a4][a5].n=a1*pl[0][2]+a2*pl[1][2]+a3*pl[2][2]+a4*pl[3][2]+a5*pl[4][2];else return ps.t[x][a1][a2][a3][a4][a5].n=fina(x+1, a1, a2, a3, a4, a5, ps);}else{y=ps.ha.get(ps.plan[x].p[i][0]);c[y]-=ps.plan[x].p[i][1];if(c[y]<0){if(x==n-1)return ps.t[x][a1][a2][a3][a4][a5].n=a1*pl[0][2]+a2*pl[1][2]+a3*pl[2][2]+a4*pl[3][2]+a5*pl[4][2];else return ps.t[x][a1][a2][a3][a4][a5].n=fina(x+1, a1, a2, a3, a4, a5, ps);}}}if(x==n-1)return ps.t[x][a1][a2][a3][a4][a5].n=fina(x, c[0], c[1], c[2], c[3], c[4], ps)+ps.plan[x].cost;return ps.t[x][a1][a2][a3][a4][a5].n=min(fina(x+1, a1, a2, a3, a4, a5, ps),fina(x, c[0], c[1], c[2], c[3], c[4], ps)+ps.plan[x].cost);}}}private static int min(int x, int y) {// TODO Auto-generated method stubreturn x<y?x:y;}class Node{int n;}class plan{int p[][],cost,n;}
}