完全背包问题1

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 
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 
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;
}

你可能感兴趣的:(题解,动态规划)