POJ 1276 полный рюкзак

Пример ввода

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 ; 
}
Просмотр кода

 




рекомендация

отwww.cnblogs.com/kongbb/p/10939431.html