题目链接: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; }