农夫约翰收到了一份牛奶订单,订购 M 单位的牛奶。
不幸的是,他的挤奶机刚刚坏掉了。
他只有三个桶,容积分别为 X,Y,M(1≤X<Y<M)。
三个桶最初都是空的。
使用这三个桶,他可以执行以下两种类型的操作任意次数:
将最小的桶(容积为 X 的)装满牛奶,再将其中的牛奶全部倒入容积为 M 的桶中,前提是这不会导致容积为 M 的桶溢出牛奶。 将中号的桶(容积为 Y 的)装满牛奶,再将其中的牛奶全部倒入容积为 M 的桶中,前提是这不会导致容积为 M 的桶溢出牛奶。 虽然,约翰意识到他可能无法装满容积为 M 的桶,但请帮助他确定他可以添加到这个桶中的最大牛奶量。
输入格式
共一行,包含三个整数 X,Y,M。
输出格式
输出约翰可以添加到容积为 M 的桶中的最大牛奶量。
数据范围
1≤M≤1000,
1≤X<Y<M
输入样例:
17 25 77
输出样例:
76
样例解释
在此样例中,约翰可将容积为 17 的桶装满 3 次倒入大桶中,将容积为 25 的桶装满 1 次倒入大桶中,总共添加了 76 单位牛奶。
#include<bits/stdc++.h> using namespace std; const int N = 1010; int res[N]; int main() { int x,y,m,a,b; cin>>x>>y>>m; a=m/x; b=m/y; int maxt=0,ans; for(int i=0;i<=a;i++) { ans=i*x;; for(int j=0;j<=b;j++) { if(j) ans+=y; if(ans>m) break; else { maxt=max(maxt,ans); } } } cout<<maxt; return 0; }
**直接转换为dp完全背包一维优化** #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N = 1010; int f[N]; int w[3], v[3]; int main() { int x, y, m; for(int i = 1; i <= 2; i++) cin >> w[i], v[i] = w[i]; cin >> m; for(int i = 1; i <= 2; i++) for(int j = v[i]; j <= m; j++) f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[m]; return 0; }
#include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; int ans=-0x7f7f7f7f; int t; for(int i=0;i*b<=c;i++)t=(c-i*b)/a,ans=max(ans,i*b+a*t); cout<<ans<<endl; return 0; }