关注
来个java版的 全ac的背包
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); int money = sc.nextInt(); List<Integer> list = new ArrayList<>(); while (sc.hasNext()) {
list.add(sc.nextInt()); } int[] cost = new int[list.size() / 2]; int[] earn = new int[list.size() / 2]; int[] chosen = new int[list.size() / 2]; for (int i = 0; i < list.size(); ++i) { if (i < list.size() / 2) {
cost[i] = list.get(i); chosen[i] = 0; } else {
earn[i - list.size() / 2] = list.get(i); }
} // d[i][j]表示前i个物品放入容量为j的背包的最大价值 // d[i][j] = max(d[i-1][j], d[i-1][j-weights[i]] + values[i]) int[][] d = new int[cost.length][money + 1]; for (int i = 0; i < d.length; ++i) { for (int j = 1; j < money + 1; ++j) { if (i == 0) { if (cost[i] <= j) {
d[i][j] = cost[i]; }
} else { if (j >= cost[i]) {
d[i][j] = Math.max(d[i - 1][j], d[i - 1][j - cost[i]] + earn[i]); } else {
d[i][j] = d[i - 1][j]; }
}
}
} int ii = cost.length - 1, jj = money; while (ii >= 0) { if (ii > 0) { if (jj-cost[ii] >= 0 && d[ii][jj] == d[ii - 1][jj - cost[ii]] + earn[ii]) {
chosen[ii] = 1; jj -= cost[ii]; }
} else { if (cost[ii] <= jj) {
chosen[ii] = 1; }
}
ii--; } boolean first = true; for (int i = 0; i < chosen.length; ++i) { if (chosen[i] == 1) { if (first) {
System.out.print(i + 1); first = false; } else {
System.out.print(" " + (i + 1)); }
}
}
}
查看原帖
点赞 评论
相关推荐
12-18 17:51
浙江大学 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你小心翼翼的闯过多大的祸? #
3962次浏览 68人参与
# 找不到实习会影响秋招吗 #
1399815次浏览 13635人参与
# 实习没事做是福还是祸? #
4294次浏览 68人参与
# 重来一次,你会对开始求职的自己说 #
935次浏览 19人参与
# 2025年终总结 #
134408次浏览 2294人参与
# 考研人,我有话说 #
156596次浏览 1211人参与
# 哪些公司笔/面试难度大? #
7074次浏览 32人参与
# 实习简历求拷打 #
24104次浏览 249人参与
# 你觉得现在还能进互联网吗? #
29961次浏览 201人参与
# 携程工作体验 #
18952次浏览 66人参与
# 大厂VS公务员你怎么选 #
69141次浏览 638人参与
# 扒一扒那些奇葩实习经历 #
140178次浏览 1149人参与
# 找不到好工作选择GAP真的丢人吗 #
93701次浏览 1007人参与
# 那些我实习了才知道的事 #
253103次浏览 1785人参与
# 非技术投递记录 #
672932次浏览 6820人参与
# 机械求职避坑tips #
81087次浏览 531人参与
# 投格力的你,拿到offer了吗? #
154960次浏览 829人参与
# 第一份工作能做外包吗? #
94065次浏览 599人参与
# 作业帮求职进展汇总 #
85480次浏览 559人参与
# 秋招遇到的奇葩面试题 #
101263次浏览 416人参与
