Я пытаюсь решить проблему с Codeforces (http://codeforces.com/problemset/problem/189/A) Вот постановка задачи:Как решить эту проблему с помощью подхода Dynamic Programming Top Down?
Поликарп имеет ленту, ее длина равна п. Он хочет разрезать ленту таким образом, чтобы она выполняла следующие два условия:
После резки каждая ленточная деталь должна иметь длину a, b или c. После резки количество деталей ленты должно быть максимально. Помогите Polycarpus и найдите количество частей ленты после требуемой резки .
Ввод Первая строка содержит четыре целых числа, разделенные пробелами n, a, b и c (1 ≤ n, a, b, c ≤ 4000) - длина исходной ленты и допустимые длины элементов ленты после резки, соответственно. Числа a, b и c могут совпадать.
Выход Распечатайте единственное число - максимально возможное количество элементов ленты. Гарантируется, что существует по крайней мере одна правильная режущая лента.
Пример ввод
Пример вывод
Я попытался решить эту проблему с помощью динамического программирования (Перевернутый подхода). Но я не могу получить правильный ответ. Возможно, что-то не так с рекурсивной функцией. Вот мой код:
#include<bits/stdc++.h>
using namespace std;
int n,s;
int a[3];
int val,m=-1;
int dp(int n)
{
if(n==0)
return 0;
for(int i=0;i<3;i++)
{
if(n>=a[i])
{
val=1+dp(n-a[i]);
}
}
if(val>m)
m=val;
return m;
}
int main()
{
scanf("%d %d %d %d",&n,&a[0],&a[1],&a[2]);
cout<<dp(n)<<endl;
return 0;
}
В чем проблема в вышеуказанном подходе?
Для начала вы обычно не должны включать заголовочные файлы '', и особенно не' ' и ''. И есть ли причина, по которой вы используете 'scanf' в программе на C++? –
@JoachimPileborg Я знаю, что это не очень хороший способ использовать или scanf в коде на C++. Но эта тактика используется в конкурсах программирования. Это мой код для проблем программирования. –
Scott
Просто потому, что у других людей плохие привычки, это не значит, что вы должны иметь это. Если вы хотите стать хорошим программистом, с самого начала используйте хорошие методы программирования и хорошие привычки. И не делайте конкурсов программирования, они действительно не превратят вас в хорошего программиста, если вы не считаете, что запутанный и раскованный код хорош. Изучайте хорошие методы программирования, основные и расширенные структуры данных и алгоритмы, и, прежде всего, как писать хороший, читаемый и поддерживаемый код, * затем * начинайте работать над этими конкурсами, если вы все еще хотите. –