2 回答

TA貢獻1825條經驗 獲得超4個贊
我認為一個簡單的遞歸排列函數就足夠了 - 您只需要跟蹤選擇的最后一個項目并將其從下一個商店中排除。
下面是一些 Java 代碼來說明:
static int minCost(int[][] prices, int store, int cost, int lastItem)
{
if(store==prices.length)
return cost;
int min = Integer.MAX_VALUE;
for(int item=0; item<prices[store].length; item++)
{
if(item != lastItem)
min = Math.min(min, minCost(prices, store+1, cost+prices[store][item], item));
}
return min;
}
public static void main(String[] args)
{
int[][] prices1 = {{1,50,50},{48,50,50},{1,50,50}};
System.out.println(minCost(prices1, 0, 0, -1));
int[][] prices2 = {{1,50,50},{48,50,50},{1,50,50},{4,3,5},{20,1,20}};
System.out.println(minCost(prices2, 0, 0, -1));
}
輸出:
52
58

TA貢獻1895條經驗 獲得超3個贊
假設我正確理解了這個問題,下面是我將如何在預填充的商店數組中解決它。我們找到每個存儲數組中的最小值,并通過存儲和比較它來排除之前存儲中已經使用過的索引。
private int stores[][]={{1,50,50},{48,50,50},{1,50,50},{4,3,5},{20,1,20}};
public void solve() {
int cost=0;
int lastItemPurchased=-1;
for (int storeIndex = 0; storeIndex < stores.length; storeIndex++) {
int lowestPriceInStoreIndex=getMinValueIndex(stores[storeIndex],lastItemPurchased);
cost+=stores[storeIndex][lowestPriceInStoreIndex];
lastItemPurchased=lowestPriceInStoreIndex;
}
System.out.println("Cost: "+cost);
}
public int getMinValueIndex(int[] numbers,int indexToExclude){
int minValue = 0;
for(int i=1;i<numbers.length;i++){
if(i==indexToExclude)
continue;
if(numbers[i] < numbers[minValue]||minValue==indexToExclude){
minValue = i;
}
}
return minValue;
}
這輸出 75,因為它應該是 1+50+1+3+20。
添加回答
舉報