Пример ввода
735 3 4 5 6 125 350 3 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10
Пример вывода
735 630 0 0
смысл вопросов: Есть ли у вас банковской карты юаней наличными, и банкоматы, есть ˝n˝ деноминации денег, денег п строк каждого числа и номинальной стоимости.
Это наиболее часто задаваемый , сколько денег из банкомата наизнанку.
Рюкзак полностью голый ,
но я на самом деле не так. , , ,
Если текущее количество элементов значения больше или равно Рюкзак * мощности, его можно рассматривать как бесконечное число текущих элементов, для цикла , когда он пересекал положительную последовательность от мало до велика.
Когда меньше или равно числу статей 01 преобразует двоичный рюкзаке рюкзак 01 здесь! ! !
# include <cstdio> #include <CString> #include <алгоритм> с помощью пространства имен STD; ИНТ наличные, п; INT с [ 15 ], ш [ 15 ]; INT дп [ 100005 ]; недействительным CompletePack ( ИНТ с, ИНТ ш) { если (с * ш> = наличными) { // 完全背包 для ( INT J = W, J <= наличные; j ++ ) дп [у] = тах (дп [J], дп [JW] + W); } Еще { // 多次01背包 ИНТ к =1 ; в то время как (к < с) { для ( INT J = наличности; J> = ш * к; j-- ) дп [J] = макс (дп [J], дп [JW * K] + W * к); с - = к; K << = 1 ; } Для ( Int J = наличности, J> = W * C; j-- ) дп [J] = макс (дп [J], дп [JW * с] + W * с); } } INT основных () { в то время как (Scanf ( " % D% D " , & наличными, & п)! = EOF) { MemSet (дп, 0, SizeOf (др)); для ( INT I = 0 ; <п; я ++ ) { зсапЕ ( " % d% d " , & с [I], & ш [I]); } Для ( INT I = 0 ; <п; я ++ ) { CompletePack (с [I], ш [I]); } Е ( " % d \ п " , дп [наличные]); } Возвращает 0 ; }