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。
添加回答
举报