Milk Pails
链接:https://ac.nowcoder.com/acm/contest/7163/E
来源:牛客网
题目大意:给出能装X单位和Y单位牛奶的桶,每次装满后倒入M单位的桶,确保不会溢出,问M单位的桶最多能装多少单位的牛奶
样例输入:
17 25 77
样例输出:
76
样例解释:
In this example, FJ fills the pail of size 17 three times and the pail of size 25 once, accumulating a total of 76 units of milk.
思路:
完全背包, d p [ i ] = 1 dp[i]=1 dp[i]=1表示能够装 i i i单位的牛奶,否则 d p [ i ] = 0 dp[i]=0 dp[i]=0,初始状态 d p [ 0 ] = 1 dp[0]=1 dp[0]=1
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int dp[N];
int main() {
freopen("Milk Pails.in", "r", stdin);
int x, y, m;
while (scanf("%d%d%d", &x, &y, &m) == 3) {
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = x; i <= m; i++) {
dp[i] |= dp[i-x];
}
for (int i = y; i <= m; i++) {
dp[i] |= dp[i-y];
}
for (int i = m; i >= 0; i--) {
if (dp[i]) {
printf("%d\n", i);
break;
}
}
}
return 0;
}
Fruit Feast
链接:https://ac.nowcoder.com/acm/contest/7163/I
来源:牛客网
题目大意:每吃一个柠檬饱腹感加A,每吃一个橘子饱腹感加B,可以选择喝一次水,饱腹感减半,向下取整,最大饱腹感为T,问能达到的最大饱腹感
样例输入:
8 5 6
样例输入:
8
样例解释:
吃一个橘子,饱腹感为6,喝水,饱腹感为3,吃一个柠檬,饱腹感为5
思路:
完全背包, d p [ i ] dp[i] dp[i]表示能够获得的饱腹感, d p [ i ] = 1 dp[i]=1 dp[i]=1表示能够达到饱腹感 i i i,否则 d p [ i ] = 0 dp[i]=0 dp[i]=0,初始状态 d p [ 0 ] = 1 dp[0]=1 dp[0]=1,转移的时候注意减半也需要转移
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6+7;
int dp[N];
int main() {
//freopen("Fruit Feast.in", "r", stdin);
int t, a, b;
while (scanf("%d%d%d", &t, &a, &b) == 3) {
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = a; i <= t; i++) {
dp[i] |= dp[i-a];
}
for (int i = b; i <= t; i++) {
dp[i] |= dp[i-b];
}
for (int i = 0; i <= t; i++) {
dp[i/2] |= dp[i];
}
for (int i = a; i <= t; i++) {
dp[i] |= dp[i-a];
}
for (int i = b; i <= t; i++) {
dp[i] |= dp[i-b];
}
for (int i = t; i >= 0; i--) {
if (dp[i]) {
printf("%d\n", i);
break;
}
}
}
return 0;
}