完全揹包 nyoj 311

2021-06-21 01:26:52 字數 1180 閱讀 2450

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:4 描述

直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。

第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價值總和是多少。如果不能恰好裝滿揹包,輸出no

輸入

第一行: n 表示有多少組測試資料(n<7)。 

接下來每組測試資料的第一行有兩個整數m,v。 m表示物品種類的數目,v表示揹包的總容量。(0輸出

對應每組測試資料輸出結果(如果能恰好裝滿揹包,輸出裝滿揹包時揹包內物品的最大價值總和。 如果不能恰好裝滿揹包,輸出no)

樣例輸入

2

1 52 2

2 52 2

5 1

樣例輸出

no

1

這題需要注意的是要求恰好裝滿揹包,所以最初陣列的值要初始化為負無窮 , 只有dp。如果不要求揹包恰好裝滿,那麼初始化為0就可以

遞推方程式:dp[j] = dp[j] > (dp[j - c] + w) ? dp[j] : dp[j - c] + w;

舉個簡單的例子:只有兩個物品, 揹包容量是5,兩個物品重量和價值分別是 5, 1和3, 100

陣列初始化為負無窮時,  首先dp[5] = dp[0] + 1 = 1, 其次dp[5] = max, 此時因為dp[2]是負無窮 (2在這個題中就是不可能實現的揹包重量), 所以dp[2] +1也是負無窮,所以也就代表揹包容量是5的時候不可能通過3這個物品將揹包裝滿。dp[5] = 1

陣列初始化為0時, 首先dp[5] = dp[0] + 1 = 1, 其次dp[5] = max  因為dp[2] = 0 , 所以dp[2] +100 > dp[5],那麼dp[5]就是100 

#include long long dp[50010];

void init()

int main (void)

} if(dp[v] < 0)

printf("no\n");

else

printf("%lld\n", dp[v]);

} return 0;

}

NYOJ 311 完全揹包

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...

nyoj 311完全揹包

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...

NYOJ 311 完全揹包

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...