UVA 624 CD 01揹包問題

2021-06-26 23:15:33 字數 604 閱讀 1134

解題思路:01揹包問題,路徑比較難,用乙個陣列記錄,陣列儲存的是前m-1的數的和,那個和必然也是最大的,輸出的時候進行判斷,如果是小於那個數的,就不符合條件。感覺01揹包題目,如果是有限個數量的話,就用二維陣列表示狀態,如果是無限的話,就用一維的表示,uva 10465就是無限個的

#include#include#define maxn 10010

int c[20+5],dp[25][maxn],path[25][maxn];

int n,m;

int main() }}

int k = n;

int p[30],count = 0;

for(int i = m,j = n; i >= 1;k = path[i][j],j = path[i][j],i--)

if(path[i][j] < k)

p[count++] = c[i];

for(int i = count - 1; i >= 0; i--)

printf("%d ",p[i]);

printf("sum:%d\n",dp[m][n]);

} return 0;

}

UVA 624 CD 0 1揹包問題

name uva 624 cd author zj ac date 26 03 13 15 15 description 01backpack problem include include include include include using namespace std int maxval...

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