完全背包 包粽子

包粽子,包一个纯面粉的粽子需要c 克面粉,可以卖出 d 块钱

有m种配料,每种配料可以对应包一种粽子,比如

第i种配料有a[i]克,包一个该配料的粽子需要配料b[i]克,面粉c[i]克,可以卖出d[i]块钱

 

问,有n克面粉,m种配料,最多可以包粽子卖出多少块钱?

 

输入第一行为

n m c d

表示n克面粉,m种配料,纯面粉粽子需要c克面粉,价值为d

接下来m行,每行四个数a[i] b[i] c[i] d[i]  ,分别代表该配料的总重量,包一个粽子需要的配料和面粉以及价值

 

输入样例:

10 2 1 1

6 2 3 50

8 1 2 10

 

输出样例

151

 

 

完全背包问题

dp[i][j]   表示使用前 i 种配料,消耗 j 克面粉的情况下的最大价值为dp[i][j]

 

转移方程为

dp[ i ][ j ]=max(dp[ i-1 ][ j ],dp[ i-1 ][ j-k*p[ i ].c ] + k*p[ i ].d );

 

  

#include<iostream>
#include<algorithm>
using namespace std;
int dp[20][1005];
struct node {
    int a, b, c, d;
}p[20];
int main()
{
    int n, m, c0, d0;
    cin >> n >> m >> c0 >> d0;
    //把纯面的粽子当成一种配料处理
    p[0].a = n;
    p[0].b = 0;
    p[0].c = c0;
    p[0].d = d0;
    for (int i = 1; i <= m; i++) {
        cin >> p[i].a >> p[i].b >> p[i].c >> p[i].d;    
    }
    
    for (int j = 0; j < n; j++) {
        dp[0][j] = 0;
    }
    for (int i = 0; i <= m; i++) {
        dp[i][0] = 0;
    }

    //前i种粽子
    for (int i = 0; i <= m; i++) {
        //消耗j克面粉
        for (int j = 1; j <=n; j++) {
            //在面粉够用的情况下,最多包k个第i种配料的粽子
            for (int k = 0; k*p[i].c <= j ; k++) {
                //还要保证配料够
                if (k*p[i].b <= p[i].a)
                {
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - k * p[i].c] + k * p[i].d);
                }
            }
        }
    }
    cout << dp[m][n] << endl;
    system("pause");
    return 0;
}

 

posted @ 2020-07-17 20:58  知道了呀~  阅读(306)  评论(0编辑  收藏  举报