UVA 624CD(遞推 路徑列印)

2021-06-23 03:12:45 字數 891 閱讀 3086

題目: uva - 624cd(遞推+ 路徑列印)

題目大意:給出一組資料,給定乙個n,問這些資料能否拼湊出不大於n的最接近n的資料,可以的話輸出最接近n的資料,並且列印出最長路徑(要求要找輸入的順序)。

解題思路:dp【j】:代表湊出j這個數值最多需要幾個數。d【j】 = max (d【j - v【i】】 + 1。

列印路徑,如果取得是最小值,那麼順著dp標記的值的減小就可以找到路徑,但是取的是最大值,這樣它的下乙個並不能直接靠dp陣列的值來判斷,而是要判斷到最後是否最終的值等於0。用回溯。

**:

#include #include const int n = 1000005;

const int m = 25;

int visit[m];

int v[n];

int dp[n];

int n, k;

int max (const int a, const int b)

void init ()

bool printf_ans (int m, int l)

return false;

}int main ()

int i;

for (i = n; i >= 0; i--)

if (dp[i] != -1)

break;

memset (visit, 0, sizeof (visit));

printf_ans(i, 0);

for (int j = 0; j < k; j++)

if (visit[j])

printf ("%d ", v[j]);

printf ("sum:%d\n", i);

} return 0;

}

uva 624 CD 0 1揹包列印路徑

include include include include using namespace std const int inf 1000000 define n 1000000 int dp 22 n int a 22 int n,t void printf path vector v,int ...

UVA 624 CD (01揹包 帶路徑)

題意 輸入兩個數 len,n 表示長度和個數,接下來輸入n個數,表示每乙個的長度,求這n個數能夠組成的不超過len的最大長度,並輸出這些數。分析 01揹包,dp陣列非0表示可以組成的數,dp陣列用來記錄路徑 include include include include include includ...

UVA 624 CD 01揹包加路徑記錄問題

其實按照題目來後 我們直接可以寫乙個裸的01揹包,但是就是路徑不知道怎麼記錄。我們知道動態規劃的本質就是用空間換時間的方法,所以他是乙個表。我們可以開乙個vis的二維陣列表,把算出來的值記錄進去。然後把vis陣列倒著遍歷一遍就可以了。為什麼要倒著,應為我們dp表中有很多算出來的中間值不一定是我們要求...