1. 程式人生 > >程式設計之美 買書問題java

程式設計之美 買書問題java

import java.util.Comparator;

public class MaiBook {
	public static  float minCost(Integer[]num){
		float c5=Float.MAX_VALUE,c4=Float.MAX_VALUE,c3=Float.MAX_VALUE,c2=Float.MAX_VALUE,c1=Float.MAX_VALUE;//剩餘找最小花費。
		/**
		 * 狀態轉移方程
		 */
		if(num[0]==0&&num[4]==0)return 0;
		if(num[4]>=1) {
			Integer[]tem=newNum(num,4);
			c5=(float) (40*0.75+minCost(tem));
		}
		if(num[3]>=1) {
			Integer[]tem=newNum(num,3);
			c4=(float) (32*0.8+minCost(tem));
		}
		if(num[2]>=1) {
			Integer[]tem=newNum(num,2);
			c3=(float) (24*0.9+minCost(tem));
		}
		if(num[1]>=1) {
			Integer[]tem=newNum(num,1);
			c2=(float) (16*0.95+minCost(tem));
		}
			Integer[]tem=newNum(num,0);
			c1=(float) (8+minCost(tem));
			return findMin(c1,c2,c3,c4,c5);
	}
	public static Integer[] newNum(Integer[]num,int n){
		Integer[] temp=new Integer[num.length];//深複製
		for(int i=0;i<temp.length;i++)temp[i]=num[i];
		for(int i=0;i<=n;i++)temp[i]=temp[i]-1;
		Arrays.sort(temp,new Comparator<Integer>(){//重寫排序
			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				return o2-o1;
			}
			
		});
		return temp;
	}
	public static float findMin(float c1,float c2,float c3,float c4,float c5){
		float min=c1;
		if(c2<min) min=c2;
		if(c3<min)min=c3;
		if(c4<min)min=c4;
		if(c5<min)min=c5;
		return min;
	}
	public static void main(String[]args){
		Integer[] res={9,6,5,4,3};
		System.out.println(minCost(res));
	}
}

 


相關推薦

程式設計 問題java

import java.util.Comparator; public class MaiBook { public static float minCost(Integer[]num){ float c5=Float.MAX_VALUE,c4=Float.MA

[程式設計]票找零(卡特蘭數)

第一次看這題的時候沒有好好注意,後來發現這是一類大問題,學習了卡特蘭數這個概念,順便又複習了高中的排列組合知識、、、 一、書中問題 先看一下書中引入卡特蘭數的例子: 《程式設計之美》4.3買票找零:2n個人排隊買票,其中n個人持50元,n個人持1

程式設計-1.4-問題

問題描述: 《哈利波特》1-5卷促銷活動,每本8元。買不同的n本可以對應不同的折扣如下。 求解一筆訂單中,購買不同卷數不同本數的最少價格解。 問題思考: 書中給出了兩種解題思路: 思路一: 參照上一小節,仍使用遞迴方式遍歷所有解,取得最優解。 思路二: 採用貪

程式設計》1.4問題的常數時間解法

優秀書籍某出版社的《哈里波特》系列共有5卷,每本單賣都是8塊錢,如果讀者一次購買不同的k(k>=2)卷,就可以享受不同的折扣優惠,如下所示:求,如果買一批書的最低價格,即最大折扣符號說明:按照書上

程式設計》1.4 問題 貪心法則

在書中,作者分析兩種解法 解法一是貪心,最後得到的結論是:貪心不成立 解法二是dp , 也類似於遞迴,最後是成立的 在這裡我們重點分析貪心法不成立的原因,以及如何改進 貪心法的適用有兩個必要條件,即

併發程式設計,帶你深入理解java多執行緒原理

1.什麼是多執行緒? 多執行緒是為了使得多個執行緒並行的工作以完成多項任務,以提高系統的效率。執行緒是在同一時間需要完成多項任務的時候被實現的。 2.瞭解多執行緒 瞭解多執行緒之前我們先搞清楚幾個重要的概念! 如上圖所示:對我們的專案有一個主記憶體,這個主記憶體裡面存放了我們的共享變數、方法區、堆中的物件等

程式設計小飛的電梯排程演算法(多種解法)---Java語言

1.題目情景         我們假設都是從一樓上電梯的,而至於訊電梯停在其中的某一層。即所有的乘客都從一樓上電梯,到達某層之後,電梯停下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯則自動計算出應停的樓層,並且能夠保證該層停使得所有

Java 併發程式設計:併發程式設計高階篇之一-chat

借用 Java 併發程式設計實踐中的話:編寫正確的程式並不容易,而編寫正常的併發程式就更難了。相比於順序執行的情況,多執行緒的執行緒安全問題是微妙而且出乎意料的,因為在沒有進行適當同步的情況下多執行緒中各個操作的順序是不可預期的。 併發程式設計相比 Java

Java 併發程式設計:併發程式設計高階篇之一

借用 Java 併發程式設計實踐中的話:編寫正確的程式並不容易,而編寫正常的併發程式就更難了。相比於順序執行的情況,多執行緒的執行緒安全問題是微妙而且出乎意料的,因為在沒有進行適當同步的情況下多執行緒中各個操作的順序是不可預期的。併發程式設計相比 Java 中其他知識點學習起

|Python程式設計:最佳實踐指南

被眾多實踐驗證過的技巧、經驗大全Python安裝、配置和使用的最佳實踐手冊Python 是一個大

從《程式設計票找零問題說起,娓娓道來卡特蘭數——兼爬坑指南

#include <stdio.h> #include <stdlib.h> #define MAXN 36 unsigned long long catalan(unsigned long long *array,int n) { static int MaxIn

程式設計4.3 票找零

題目描述: 假設有2N個人在排隊買票,其中有N個人手持50元的鈔票,另外有N個人手持100元的鈔票,假設開始售票時,售票處沒有零錢,問這2N個人有多少種排隊方式,不至使售票處出現找不開錢的局面? 題目分析: 這題時典型的卡特蘭數(Cartalan)問題 Ca

Java程式設計

1.尋找發貼水王 場景: Tango是微軟亞洲研究院的一個試驗專案。研究院的員工和實習生們都很喜歡在Tango上面交流灌水。傳說,Tango有一大“水王”,他不但喜歡發貼,還會回覆其他ID發的每個帖子。坊間風聞該“水王”發帖數目超過了帖子總數的一半。如果你有一個當前論壇上所有

程式設計4.3票找零

解法二的筆記: 存在某個k,使序列前k項中1的個數比0的個數剛好小1? 假設不存在這樣的k,那麼由於是非法序列那麼k=2n-1時,1的個數至少比0小於2,這樣無論第2n個數取0還是取1,0和1的總個數均不會相等,所以假設不成立。 必存在k使序列前k項中1的個數比0的個數剛

JAVA控制CPU佔用率(程式設計有感)(二)

JAVA控制CPU佔用率(程式設計之美有感)(二)   繼續上次的電腦CPU控制,很遺憾更新的有點慢,雖然我知道沒人看,最近專案上任務有點多,所以時間少了點,不過我是達不到目的是不會放棄的!   上次勉強能達到有點類似於直線的CPU佔用率控制圖,但是這只是所有CP

編程-翻烙餅Java實現

翻烙餅從今天開始每天至少一個算法。前言翻烙餅問題是非常經典的問題,星期五的晚上,一幫同事在希格瑪大廈附近的“硬盤酒吧”多喝了幾杯。程序員多喝了幾杯之後談什麽呢?自然是算法問題。有個同事說: “我以前在餐館打工,顧客經常點非常多的烙餅。店裏的餅大小不一,我習慣在到達顧客飯桌前,把一摞餅按照大小次序擺好——小的在

程式設計——一摞烙餅的排序(暴搜+剪枝)

題目 分析 深度優先搜尋遍歷每一種情況,去翻轉次數最小的,當然,還要加一些剪枝,畢竟O(nn)的時間複雜度。 程式碼 C風格 1 /**** 字首排序 ****/ 2 #include<stdio.h> 3 #include<cstring> 4 #incl

程式設計10:計算字串的相似度

我們並不在乎兩個字串變得相等之後的字串是怎樣的,所以 1.一步操作之後,再將A[2,…,lenA]和B[1,…,lenB]變成相同的字串。 2.一步操作之後,再將A[1,…,lenA]和B[2,…,lenB]變成相同的字串。 3.一步操作之後,再將A[2,…,lenA]和B[2,…,lenB]變成相

程式設計9:陣列迴圈位移

1: RightShift(int *arr, int N, int K) { K %= N; while (K--) { int t = arr[N - 1]; for (int i = N - 1; i > 0; i--)

程式設計8:求陣列的子陣列之和的最大值

1: int MaxSum(int *A, int n) { int maximum = -INF; int sum; for (int i = 0; i < n; i++) { sum = 0; for (int j = i;