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