- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一组随机值和一个目标值。
#!/bin/bash
objective='50'
declare -a values=(1 2 2 6 8 14.5 15 28.7 .. 42)
我需要找到一种方法来提取数组“值”中加起来为 50 的任意数字组合
数组有重复项和浮点整数。
解决方案集可能如下所示:
50 = 42 + 8
50 = 42 + 6 + 2
最初我在 bash 中使用了一些嵌套的 for 循环,但是我很快意识到这将随着我的数组长度呈指数增长。
我在大学里上了几门 Java 类(class),但我在编程方面仍然缺乏经验。我开始认为这可能需要递归。
有更多编程经验的人能为我指明正确的方向吗?
除了嵌套 for 循环之外,您还能如何解决这个问题?
最佳答案
这是一个时间复杂度为 O(M*N)
的算法,其中 M
是目标,N
是集合的总大小。使用背包问题类比如下:-
- Knapsack capacity = Target
- Items are elements in the set with weight & value same as itself
- Calculate maximum profit using dynamic programming
- maxprofit = Target then there is/are subset which sum up to target.
- Retrace the solution.
相同的 Java 解决方案:-
public class SubSetSum {
static int[][] costs;
public static void calSets(int target,int[] arr) {
costs = new int[arr.length][target+1];
for(int j=0;j<=target;j++) {
if(arr[0]<=j) {
costs[0][j] = arr[0];
}
}
for(int i=1;i<arr.length;i++) {
for(int j=0;j<=target;j++) {
costs[i][j] = costs[i-1][j];
if(arr[i]<=j) {
costs[i][j] = Math.max(costs[i][j],costs[i-1][j-arr[i]]+arr[i]);
}
}
}
System.out.println(costs[arr.length-1][target]);
if(costs[arr.length-1][target]==target) {
System.out.println("Sets :");
printSets(arr,arr.length-1,target,"");
}
else System.out.println("No such Set found");
}
public static void printSets(int[] arr,int n,int w,String result) {
if(w==0) {
System.out.println(result);
return;
}
if(n==0) {
System.out.println(result+","+arr[0]);
return;
}
if(costs[n-1][w]==costs[n][w]) {
printSets(arr,n-1,w,new String(result));
}
if(arr[n]<=w&&(costs[n-1][w-arr[n]]+arr[n])==costs[n][w]) {
printSets(arr,n-1,w-arr[n],result+","+arr[n]);
}
}
public static void main(String[] args) {
int[] arr = {1,2,3,8,9,7};
calSets(10,arr);
}
}
关于java - 如何查找数组中的任何值加起来是否为 n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21670732/
我正在尝试执行 vagrant up 但一直遇到此错误: ==> default: IOError: [Errno 13] Permission denied: '/usr/local/lib/pyt
我在容器 div 中有一系列动态创建的不同高度的 div。 Varying text... Varying text... Varying text... Varying text.
通过 cygwin 运行 vagrant up 时遇到以下错误。 stderr: /bin/bash: /home/vagrant/.ansible/tmp/ansible-tmp-14872260
今天要向小伙伴们介绍的是一个能够快速地把数据制作成可视化、交互页面的 Python 框架:Streamlit,分分钟让你的数据动起来! 犹记得我在做机器学习和数据分析方面的毕设时,
我是 vagrant 的新手,正在尝试将第二个磁盘添加到我正在用 vagrant 制作的虚拟机中。 我想出了如何在第一次启动虚拟机时连接磁盘,但是当我关闭机器时 然后再次备份(使用 'vagrant
我是一名优秀的程序员,十分优秀!