時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:4 描述
直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。
第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價值總和是多少。如果不能恰好裝滿揹包,輸出no
輸入
第一行: n 表示有多少組測試資料(n<7)。
接下來每組測試資料的第一行有兩個整數m,v。 m表示物品種類的數目,v表示揹包的總容量。(0輸出
對應每組測試資料輸出結果(如果能恰好裝滿揹包,輸出裝滿揹包時揹包內物品的最大價值總和。 如果不能恰好裝滿揹包,輸出no)
樣例輸入
21 52 2
2 52 2
5 1
樣例輸出
no1
這題需要注意的是要求恰好裝滿揹包,所以最初陣列的值要初始化為負無窮 , 只有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。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...