java算法|牛牛们吃糖果 —【2021】阿里巴巴编程题(4星)-题解
问题描述
有n
个牛牛一起去朋友家吃糖果,第个牛牛一定要吃ai
块糖果.而朋友家一共只有m
块糖果,可能不会满足所有的牛牛都吃上糖果。同时牛牛们有k
个约定,每一个约定为一个牛牛的编号(i,j)
对,表示第i
个和第j
个牛牛是好朋友,他俩要么一起都吃到糖果,要么一起都不吃。
保证每个牛牛最多只出现在一个编号对中。
您可以安排让一些牛牛吃糖果,一些牛牛不吃。
要求使能吃上糖果的牛牛数量最多(吃掉的糖果总量要小于等于m
),并要满足不违反牛牛们的k
个约定。
输入示例
3 10
5 1 5
1
1 3
输出示例
2
代码实现
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// n 个牛牛
int n = sc.nextInt();
// m 颗糖果
int m = sc.nextInt();
// 每个牛牛吃到的糖果 a[i]
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
if (a[i] < 1 || a[i] > 1000000) {
return;
}
}
int[] v = new int[a.length];
Arrays.fill(v, 1);
// k 个约定
int k = sc.nextInt();
//第 i 个牛牛与第 j 个牛牛有约定
for (int i = 0; i < k; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
a[x - 1] += a[y - 1];
v[x - 1] += 1;
v[y - 1] = 0;
}
int[] opt = new int[m + 1];
Arrays.fill(opt, 0);
for (int i = 0; i < n; i++) {
if (v[i] == 0) {
continue;
}
for (int j = m; j > a[i] - 1; --j) {
opt[j] = Math.max(opt[j], (opt[j - a[i]] + v[i]));
}
}
//最多能吃到糖果的牛牛个数
System.out.print(opt[opt.length - 1]);
}
}
运行结果
还没有优化,欢迎大家指教😄
本文来自博客园,作者:Evan-LiuXing,转载请注明原文链接:https://www.cnblogs.com/liuxing98/p/17161523.html