时间限制:C/C++语言 2000MS;其他语言 4000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
小明一共有n根彩色粉笔,m根白色粉笔,现在可以用a根彩色粉笔和b根白色粉笔组成一盒卖x元,或者c根白色粉笔组成一盒卖y元,或者d根彩色粉笔组成一盒卖z元,小明最多可以用这些粉笔卖多少元?不一定要把所有粉笔卖完,小明只希望利益最大化。
输入
第一行2个整数n,m,1≤n,m≤2000;
第二行4个整数a,b,c,d,1≤a,b,c,d≤1000;
第三行3个整数x,y,z,1≤x,y,z≤1000。
输出
输出一个整数,表示最多可以卖到多少元。
样例输入
5 5
1 2 3 3
2 1 3
样例输出
7
Hint
补充样例:
输入样例:
5 15
1 2 3 6
2 1 3
输出样例:
11
思路:没什么好说的,三种状态
max(dp[i][j],dp[i][j−c]+y)max(dp[i][j],dp[i−d][j]+z)max(dp[i][j],dp[i−a][j−b]+x)j>=ci>=di>=a,j>=b
#include <iostream>
#include <cstring>
using namespace std;
const int Maxn = 2005;
int dp[Maxn][Maxn];
int max(const int& a, const int& b)
{
return a>b?a:b;
}
int main()
{
int n, m;
int a, b, c, d;
int x, y, z;
while(cin >> n >> m)
{
cin >> a >> b >> c >> d;
cin >> x >> y >> z;
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
{
if(j>=c)
dp[i][j] = max(dp[i][j], dp[i][j-c]+y);
if(i>=d)
dp[i][j] = max(dp[i][j], dp[i-d][j]+z);
if(i>=a && j>=b)
dp[i][j] = max(dp[i][j], dp[i-a][j-b]+x);
}
cout << dp[n][m] << endl;
}
return 0;
}