Buns---cf 106C(多重背包)

题目链接:http://codeforces.com/problemset/problem/106/C

题意:有n克面粉,m种馅料,然后每种馅料有ai克,bi克馅料和ci克面粉做的面包可以买di元,也可以不放馅料,那么c0克面粉做的面包可以卖d0元,求最多可以赚多少钱;

不放馅料,那么c0克面粉做的面包可以卖d0元,这句话可以认为是物品的个数不限(即ai/bi很大)的一种物品;

ai克馅料最多只能做ai/bi个面包,所以可以转化为总费用为 n ,有m+1个物品,每个物品的个数是ai/bi,每个的价值是 di ,花费是 ci,求最大价值;

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>

using namespace std;

#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f
#define N 210

int n, m, c[N], d[N], a[N], b[N], dp[N][N*N];
int main()
{

    while(scanf("%d %d %d %d", &n, &m, &c[1], &d[1])!=EOF)
    {
        met(dp, 0);
        a[1] = 11000;
        b[1] = 1;
        for(int i=2; i<=m+1; i++)
        {
            scanf("%d %d %d %d", &a[i], &b[i], &c[i], &d[i]);
        }
        for(int i=1; i<=m+1; i++)
        {
            for(int k=0; k<=a[i]/b[i]; k++)
            {
                for(int j=n; j>=k*c[i]; j--)
                {
                    dp[i][j] = max(dp[i][j], dp[i-1][j-k*c[i]]+k*d[i]);
                }
            }
        }
        printf("%d
", dp[m+1][n]);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/5261621.html