您的位置:首页 > 其它

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

2016-03-10 13:47 495 查看
题目链接: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
, d
, a
, b
, dp
[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\n", dp[m+1]
);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: