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 n, m, c0 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 ai, bi, ci 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;
}