包粽子,包一个纯面粉的粽子需要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; }