Codeforces 106 C Buns【多重背包-一> 一维背包】

Lavrenty, a baker, is going to make several buns with stuffings and sell them.

Lavrenty has n grams of dough as well as m different stuffing types. The stuffing types are numerated from 1 to m. Lavrenty knows that he has ai grams left of the i-th stuffing. It takes exactly bi grams of stuffing i and ci grams of dough to cook a bun with the i-th stuffing. Such bun can be sold for di tugriks.

Also he can make buns without stuffings. Each of such buns requires c0 grams of dough and it can be sold for d0 tugriks. So Lavrenty can cook any number of buns with different stuffings or without it unless he runs out of dough and the stuffings. Lavrenty throws away all excess material left after baking.

Find the maximum number of tugriks Lavrenty can earn.

Input

The first line contains 4 integers nmc0 and d0 (1 ≤ n ≤ 1000, 1 ≤ m ≤ 10, 1 ≤ c0, d0 ≤ 100). Each of the following m lines contains 4 integers. The i-th line contains numbers aibici and di (1 ≤ ai, bi, ci, di ≤ 100).

Output

Print the only number — the maximum number of tugriks Lavrenty can earn.

Examples

Input

10 2 2 1
7 3 2 100
12 3 1 10

Output

241

Input

100 1 25 50
15 5 20 10

Output

200

题意:

     给n千克的面粉有m种配料,只用c0千克的面粉做成的面包可以卖d0,如果Ci千克的面粉加上Bi千克的配料可以卖Di,求可以获得的最大的价值。

分析:

     不是很懂,看题解的理解是可以将多重背包通过先计算出无配料的时的价值,然后通过枚举不同类型的制作方式,将原来无配料时制作面包的面粉当做一维的背包,通过一维背包简单计算出最后的徐最大值。(具体见代码)

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
using namespace std;
int dp[1008];
int main()
{
    int n,m,c0,d0;
    scanf("%d%d%d%d",&n,&m,&c0,&d0);
    for(int i=c0;i<=n;i++)
        dp[i]=i/c0*d0;
        int a,b,c,d;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        for(int j=1;j<=a/b;j++)///使用i最多生成a/b个合成品
        {
            for(int k=n;k>=c;k--)
            {
                dp[k]=max(dp[k-c]+d,dp[k]);///将一些做没有混合物的面团拿来做混合物的面包
            }
        }
    }
    printf("%d\n",dp[n]);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码的小帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值