Проблема 106C из CF не работает должным образом - PullRequest
0 голосов
/ 21 декабря 2018

Вопрос: https://codeforces.com/problemset/problem/106/C

Лаврентий, пекарь, собирается сделать несколько булочек с начинками и продать их.

Лаврентий имеет n граммов теста, а такжеразные виды начинки.Типы начинки нумеруются от 1 до m.Лаврентий знает, что от i-й начинки осталось всего несколько граммов.Для приготовления булочки с i-й начинкой требуется ровно двести граммов начинки i и ci грамма теста.Такую булочку можно продать за ди тугрикс.

Также он может делать булочки без начинки.Каждой из таких булочек требуется около 30 граммов теста, и ее можно продать за d0 тугриков.Таким образом, Лаврентий может приготовить любое количество булочек с разными начинками или без них, если у него нет теста и начинки.Лаврентий выбрасывает весь лишний материал, оставшийся после выпекания.

Найдите максимальное количество тугриков, которое Лаврентий может заработать.

Вот мой алгоритм, который написан без объяснений.Я думаю, что это правильно, и код поврежден.

/*
dp[amt-of-dough-used_i][stuffing-used_j][stuffing_times-used_k] = max profit when i grams of dough is used for making stuffing j for a total of k times.


dp[i][j][k]=dp[i-k*c[i]][j][0] for all k=0,1,...,b[i]/c[i].

best[amt-of-dough-used_i] = max(dp[i][j][k] for all j,k).

Answer :

max(best[i] + d*[(n-i)/c] for all i)
*/

Вот мой код: https://ideone.com/70FMql

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,c_0,d_0;
    cin>>n>>m>>c_0>>d_0;
    int dp[n+1][m+1][101];
    int a[m+1], b[m+1], c[m+1], d[m+1];
    for (int i=1; i<=m; m++)
        cin>>a[i]>>b[i]>>c[i]>>d[i];


    for (int i=0; i<=n; i++)
    for (int j=1; j<=m; j++)
    for (int k=0; k<=a[j]/b[j]; k++)
    {
        dp[i][j][0]=d[j];

        if (k!=0) dp[i][j][k]=0;

    }

    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            for (int k=0; k<=a[j]/b[j]; k++)

                if (i>=k*c[i])
                dp[i][j][k]=dp[i-k*c[i]][j][0];

    int best[n+1];
    for (int i=0; i<=n; i++) best[i]=0;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
        for (int k=0; k<=a[j]/b[j]; k++)
            best[i]=max(best[i],dp[i][j][k]);

    int ans=0;
    for (int i=0; i<=n; i++)
        ans = max(ans, best[i] + d_0*(n-i)/c_0);

    cout<<ans<<endl;
}

** 2 Примеры тестовых случаев были предоставлены в упомянутой ссылке Ideone,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...