牛牛们吃糖果—【2021】阿里巴巴编程题(4星)-题解
问题描述:
有n
个牛牛一起去朋友家吃糖果,第个牛牛一定要吃ai
块糖果.而朋友家一共只有m
块糖果,可能不会满足所有的牛牛都吃上糖果。同时牛牛们有k
个约定,每一个约定为一个牛牛的编号(i,j)
对,表示第i
个和第j
个牛牛是好朋友,他俩要么一起都吃到糖果,要么一起都不吃。
保证每个牛牛最多只出现在一个编号对中。
您可以安排让一些牛牛吃糖果,一些牛牛不吃。
要求使能吃上糖果的牛牛数量最多(吃掉的糖果总量要小于等于m
),并要满足不违反牛牛们的k
个约定。
输入示例:
3 10
5 1 5
1
1 3
输出示例:
2
实现代码:
java实现
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]); } }
还没有优化,欢迎大家指教😄