题意:
现在有nkg的面,和m种馅,如果是只买面做的馒头,c0kg面,做一个d0价值的馒头。
m种馅有a,b,c,d四种属性,a馅的量,b制作一个这种面包需要的馅的量,c是需要面的量,d是该种面包能卖多少钱。
问最多能销售多少钱。
分析:
贪心考虑第一时间否定。
动态规划:考虑与结果相关的参数。面的质量i,使用了前j种馅,一共做了k个j馅。
d(i,j,k)就是我们要的答案。
状态转移:
for(int i=0;i<m;i++){
for(int j=1;j<=x[i].a/x[i].b;j++){
for(int k=n;k>=x[i].c;k--){
dp[k]=max(dp[k],dp[k-x[i].c]+x[i].d);
}
}
}
完整代码:
扫描二维码关注公众号,回复:
2375549 查看本文章
#include<bits/stdc++.h>
using namespace std;
#define N 10005
struct Node{
int a,b,c,d;
}x[N];
int dp[N];
int main(){
int n,m,c,d;
cin>>n>>m>>c>>d;
for(int i=0;i<m;i++){
cin>>x[i].a>>x[i].b>>x[i].c>>x[i].d;
}
for(int i=0;i<=n;i++)dp[i]=(i/c)*d;
for(int i=0;i<m;i++){
for(int j=1;j<=x[i].a/x[i].b;j++){
for(int k=n;k>=x[i].c;k--){
dp[k]=max(dp[k],dp[k-x[i].c]+x[i].d);
}
}
}
cout<<dp[n];
}