CF的问题106C无法正常工作

时间:2018-12-21 13:46:32

标签: algorithm recursion dynamic-programming

问题:https://codeforces.com/problemset/problem/106/C

  

面包师拉夫伦蒂(Lavrenty)将用馅料制作几包   卖掉它们。

     

Lavrenty具有n克面团以及m种不同的馅料类型。   填充类型的编号从1到m。 Lavrenty知道他   第i个馅料还剩下艾克。恰好需要Bi克   将i和ci克面团塞入第i个馅中煮小圆面包。   这样的面包可以卖给土佬。

     

他还可以做无馅的stuff头。每个这样的面包都需要c0   克面团,可以卖给d0图格里克。所以Lavrenty可以煮饭   任意数量的带有不同馅料的面包或没有馅料的面包   面团和馅料用完了。 Lavrenty扔掉所有多余的东西   烘烤后剩下的材料。

     

查找Lavrenty可赚取的最大土拨鼠数量。

这是我的算法,以不言自明的方式编写。我认为这是正确的,并且代码已损坏。

/*
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链接中提供了示例测试用例。

0 个答案:

没有答案