Codeforce 106C Buns (完全背包)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lj130lj/article/details/79968747

题意:

    现在有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);

            }
        }
    }

完整代码:

    

#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];
}

阅读更多

没有更多推荐了,返回首页