Кратчайший / самый дешевый путь? Как использовать динамическое программирование здесь?

У меня проблема с динамическим программированием. Это проблема кратчайшего пути. Предполагается, что мне нужно помочь «другу» написать программу для самой дешевой плитки, которую он может использовать, чтобы построить путь к своему сараю. Переменные D (расстояние до сарая), могут быть 1 <= D < 5000, может быть N ТИПОВ плиток, так что 1 <= N <= 5000, также для каждой плитки «N» может быть длина L, так что 1 <= L <= 5000, а стоимость, С, так что 1 <= C <= 100. (Пользователь этой программы будет следовать ограничениям, перечисленным выше). Я знаю, что это проблема кратчайшего пути, но я не могу понять, как запустить график. Я думал о создании двумерного массива с расстоянием и типами плиток, но думал против этого. Я вставляю свой код ниже, он работает для тестовых случаев для проверки ошибок, но кроме этого это не так. Если бы кто-то мог дать мне подсказку о том, что я делаю неправильно или подсказку о том, как запустить график, или просто сказать мне, что я далеко от цели, это было бы здорово. Я воздерживаюсь от использования рекурсии, потому что хочу, чтобы эта программа работала эффективно, поэтому я хочу использовать динамическое программирование.

#include <iostream>
#include <utility>
#include <cstdlib>
#include <cstring>
#include <limits.h>
#include <cstdio>using namespace std;

int cheapestTiling(int dist, int numtiles, int A[], int B[]){

//distance to the shed
int shedDistance = dist;
//number of types of tiles used
int numberTiles = numtiles;

//make new arrays for the costs and lengths of each tiles
int LengthTile[numberTiles];
int PriceTile[numberTiles];
int costPerSize[numberTiles];

//min length, min price
int minlength = 0;
int minprice = 0;

while (shedDistance != 0){

for (int i = 0; i < nAumberTiles; i++){
LengthTile[i] = A[i];
PriceTile[i] = B[i];
costPerSize[i] = (A[i]/B[i])

while((LengthTile[i] > LengthTile[i+1])
{
if(shedDistance > lengthTile[i])
{
//here i'm trying to find the longer tile and use those first
//I havent started worrying about the cost yet and am just focusing
//on the length/distance aspect
int tempTile = lengthTile[i];
shedDistance = shedDistance - tempTile;
}
// else if((shedDistance < lengthTile[i]) && (lengthTile[i+1] < shedDistance))
}

}
minlength = LengthTile[0];
minprice = PriceTile[0];

for(int i = 1; i < numberTiles; i++)
{
if(LengthTile[i] < minlength)
{
minlength = LengthTile[i];
}
if(PriceTile[i] < minprice)
{
minprice = PriceTile[i];
}
}

//error check for shed distance = 1
if (shedDistance == 1)
{
shedDistance = shedDistance - minlength;
return minprice;
}
//error check for shed distance < 0
else if (shedDistance < 0)
{
return 0;
}

}}

int main (){//distance to shed
int distance = 0;
//number of types of tiles used
int num = 0;
//the return of the total cost, the answer
int totalCost = 0;//get distance to shed
cin >> distance;
//get number of types of tiles
cin >> num;

//cost of each tile used
int TileLength[num];
int TilePrice[num];for (int i = 0; i < num; i++)
{
cin >> TileLength[i];
cin >> TilePrice[i];
}

totalCost = cheapestTiling(distance, numTiles, TileLength, TilePrice);
cout << totalCost << endl;}

5

Решение

Для меня это не похоже на проблему кратчайшего пути. Это больше похоже на проблему ранца, потому что я предполагаю, что вы пытаетесь минимизировать цену, все еще достигая своей цели.

en.wikipedia.org/wiki/Knapsack_problem

Надеюсь, я помог.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]