求一个算法,有点象背包问题

使我做你和平之子 2019-09-05 06:17:09
假设有m个物品,重量不等,但都小于200,另有n个背包,容量都是200,现将物品装入背包,求最少需要多少个背包及物品的分配方案(最少背包数相同的情况下只需要一种分配方案)。
比如有3个物品,重量分别为50, 70, 100, 10,那么最少需要两个背包,分配方案(只要求求出一种,每个背包装多少无所谓):背包1装100, 70, 10, 背包2装50是一种答案;背包1装50, 10, 背包2装100, 60,也可以。

请用伪代码或者Javascript, C#, Java, Python几种语言中的一种写出算法。
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
好像是对的。感谢,结贴。
  • 打赏
  • 举报
回复
谢谢楼上回复。我测试验证一下,如果正确就结贴。
wowpH 2019-09-06
  • 打赏
  • 举报
回复
package backpack;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class BackPack {
private static List<List<Integer>> allot( int[] items,
int n) {
int MAX_SUM = 200;
int[] arr = Arrays.copyOf(items, items.length);
Arrays.sort(arr);
List<List<Integer>> list = new ArrayList<List<Integer>>();
int[] sum = new int[n];// 保存每个包已放物品的总重量
for (int i = arr.length - 1; i >= 0; --i) {// 降序
for (int j = 0; j < n; ++j) {// 检查包
if (arr[i] + sum[j] > MAX_SUM) {// 装不下,继续检查下一个包
continue;
}
List<Integer> li;
if (j < list.size()) {// 包已存在
li = list.get(j);
} else {// 包不存在
li = new ArrayList<Integer>();
list.add(li);
}
li.add(arr[i]);
sum[j] += arr[i];
break;// 第i个物品已经装好了,不用检查包了
}
}
return list;
}

public static void main(String[] args) {
int[] items1 = { 50, 70, 100, 10 };
// int[] items2 = { 101, 101, 100, 98, 1 };
List<List<Integer>> list = allot(items1, 5);
for (List<Integer> list2 : list) {
for (int val : list2) {
System.out.print(val + " ");
}
System.out.println();
}
}
}

wowpH 2019-09-06
  • 打赏
  • 举报
回复
按照重量降序排序,依次添加到背包中。就可以吧。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧