问题描述:
有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]);
}
}还没有优化,欢迎大家指教😄

京公网安备 11010502036488号