題目: 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表中有很多算出來的中間值不一定是我們要求...