2016-07-20 3 views
-6

У этого проблемы: A Milkman подает молоко в упакованных бутылках разных размеров. Возможный размер бутылок - {1, 5, 7 и 10} литров. Он хочет поставлять необходимое количество, используя как можно меньше бутылок, независимо от их размера. Ваша цель - помочь ему найти минимальное количество бутылок, необходимых для подачи данного спроса на молоко.застрял в динамическом программировании

вход Формат:

Первая строка содержит количество тестов N Далее N строк, каждая из которых содержит положительное целое число Li, который соответствует требованию молока.

Формат вывода:

Для каждого входа Ли, выведите минимальное количество бутылок, необходимых для удовлетворения спроса

Я написал этот код для этой проблемы.

#include <iostream> 
#include <vector> 
#include <stdio.h> 
#include <set> 
#include <algorithm> 
#include <string> 
#include <queue> 
#include <map> 
#include <iomanip> 
#include <locale> 
#include <stdlib.h> 
#include <cstring> 
#include <cmath> 
#include <tgmath.h> 
using namespace std; 
const int INF = 1000000000; 
int m[4] = { 1, 5, 7, 10 }; 
int r[100000000]; 

int milk(int n) { 
    int q; 

    if (r[n] < INF) 
     return r[n]; 

    if (n <= 0) 
     q = 0; 
    else { 
     q = INF; 
     for (int i = 0; i < 4; i++) { 
      if (n >= m[i]) 
       q = min(q, 1 + milk(n - m[i])); 
     } 
    } 

    r[n] = q; 

    return q; 
} 

int main() { 
    int t, n; 
    cin >> t; 

    while (t--) { 
     cin >> n; 
     memset(r, INF, sizeof(r)); 
     cout << milk(n) << endl; 
    } 

    return` 0; 
} 

Я использовал динамическое программирование для this.But я только получить выход нуля на каждые input.I новичок в dp.Please помощь.

+5

Похоже, вам, возможно, потребуется узнать, как использовать отладчик для перехода по вашему коду. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

Thanxx для справки. Не могли бы вы рассказать мне, что я правильно реализовал dp. @ NathanOliver –

+3

@TahaJiruwala Вам решать, когда вы переходите через свой код с помощью отладчика. –

ответ

-3
int milk(int n) { 
    int min; 
    memset(r, 0, sizeof(r)); 
    for (int i = 1; i <= n; i++) { 
     min = 10000000; // some very large value greater than n 
     for (j = 0; j <= 3; j++) { 
      if (m[j] > i) 
       continue; 
      else if (r[i - m[j]] < min) 
       min = r[i - m[j]]; 
     } 
     r[i] = min; 
    } 
    return r[n]; 
} 

Надеюсь, это сработает, и это поможет вам, если у вас есть какие-либо сомнения.

+2

Что случилось с кодом OPs? Что вы изменили? – user463035818

+0

Да, коды работают. Не могли бы вы дать мемуазную версию для этого. –

+3

@TahaJiruwala Lol. Вы действительно так сказали? SO не является кодовым письмом. Если вы обманываете проблемы с кодированием, вы хуже, чем Melania – sehe