不同的思路解決背包问题和约瑟夫环问题
2016-06-02 22:09
176 查看
package com.ygx.day2;
import java.util.ArrayList;
/*
//背包问题:想要背包精确的承重某个重量,在给定的n个重量选项中 选出合适的组合,不需要选出所有的组合,只要有就停止工作.
如背包能准确承重20kg,在 {11,8,7,6,5}中选,我们可以和容易用肉眼看出8,7,5的组合就可以满足条件.但用计算机处理这个
却不是那么简单.我的思路如下:
-------------------------------------------------------------------------------------------------------------------------------------
解题思路:
1.创建一背包问题的类,该类中有一个能存储integer的列表用来存储符合所有元素的和满足背包承重的元素;
2.同时还有一个匹配目标重量的函数,该函数的返回值是Boolean型的,在该函数中,通过递归,可以向列表中添加满足条件的组合
如果满足了条件就停止并输出true;
3,最后提供一个对外的获得结果的方法,该方法有三个参数:
@ param items 存储的可供选择的重量选项的数组
@ param low 在items数组中开始找匹配结果的下标
@ param target 需要匹配的重量和
--------------------------------------------------------------------------------------------------------------------------------------
/*
算法如下
1. 在选择的任何时刻,如果所选的数据项等于你所需要的总和重量,你的工作就可以停止了,此时你的函数输出true并停止
2 从第一个数据项开始选择,接下来选择的数据项的总和要等于总的重量减去第一个数据项的值,此时我们得到了一个新的目标总量
3 在选择的任何时刻,如果出现所选的值比要求的重量大,就可以直接跳过寻找下一个数据项
4 如果第一个数据项把所有方案遍历了一遍没有匹配的话就转到下一个数据项
5 如果所有方案试过以后没有结果就输出false
*/
public class MatchBag02 {
public static void main(String[] args) {
BagQuestion bq = new BagQuestion();
int [] items = {11,8,7,6,5};
int target = 20;
bq.getResult(items,0,target);
}
}
class BagQuestion {
private ArrayList<Integer> arr = new ArrayList<Integer>();
public void getResult(int [] items,int low, int target) {
if (matchBag(items,low,target) == false) {
System.out.println("没有合适的组合");
}else {
System.out.println("答案为:");
for (int i=0;i <arr.size() ;i ++ ) {
if(i == arr.size() - 1) {
System.out.println(arr.get(i));
}else {
System.out.print( arr.get(i) + ",");
}
}
}
}
public boolean matchBag(int[] items, int low ,int target) {
//用递归的方法是需要终止递归的条件的
// if(low == items.length-1 ) {
// if(items[low] == target) {
// return true;
// }else {
// return false;
// }
// }else {
//
// } 这个判断条件不行
if(items[low] == target && low < items.length)
{//遇到相等就可以停止工作,输出true;
arr.add(items[low]);
return true;
}else if(low >= items.length-1) {//如果到了数组的末尾还没有匹配到就输出false;
return false;
}else if(items[low] > target) {//如果该数比目标值大就转到下一个元素
return matchBag(items,low+1,target);
}else {
for(int i = low +1;i < items.length; i ++) {//从他的下一个元素开始遍历匹配,如果有,则添加这个元素并输出true;
if(matchBag(items,i,target - items[low])) {
arr.add(items[low]);
return true;
}
}
return matchBag(items , low + 1 , target);//如果遍历完了这个数组依旧没有合适的匹配组合,则舍弃这个数据元素转到下一个元素
}
}
}
package com.ygx.day2;
import java.util.ArrayList;
public class Demo04_Circle {
/**
*约瑟夫环问题
*/
public static void main(String[] args) {
int count = 0;
int modCount = 0;
ArrayList<Integer> list = new ArrayList<>();
for(int i = 1; i <=100; i++) {
list.add(i);
}
while(modCount < 99) {
for(int i = 0; i < list.size(); i++) {
if(list.get(i) != 0) {
//有人存在才会数.等于0就直接跳过;
count ++;
if(count % 3 == 0) {
System.out.println(list.get(i) + "出局");
list.set(i, 0);
modCount++;
}
}
}
}
System.out.println("------------------");
for (Integer integer : list) {
//打印一下最后还剩下谁?
if(integer != 0) {
System.out.println(integer);
}
}
}
}
import java.util.ArrayList;
/*
//背包问题:想要背包精确的承重某个重量,在给定的n个重量选项中 选出合适的组合,不需要选出所有的组合,只要有就停止工作.
如背包能准确承重20kg,在 {11,8,7,6,5}中选,我们可以和容易用肉眼看出8,7,5的组合就可以满足条件.但用计算机处理这个
却不是那么简单.我的思路如下:
-------------------------------------------------------------------------------------------------------------------------------------
解题思路:
1.创建一背包问题的类,该类中有一个能存储integer的列表用来存储符合所有元素的和满足背包承重的元素;
2.同时还有一个匹配目标重量的函数,该函数的返回值是Boolean型的,在该函数中,通过递归,可以向列表中添加满足条件的组合
如果满足了条件就停止并输出true;
3,最后提供一个对外的获得结果的方法,该方法有三个参数:
@ param items 存储的可供选择的重量选项的数组
@ param low 在items数组中开始找匹配结果的下标
@ param target 需要匹配的重量和
--------------------------------------------------------------------------------------------------------------------------------------
/*
算法如下
1. 在选择的任何时刻,如果所选的数据项等于你所需要的总和重量,你的工作就可以停止了,此时你的函数输出true并停止
2 从第一个数据项开始选择,接下来选择的数据项的总和要等于总的重量减去第一个数据项的值,此时我们得到了一个新的目标总量
3 在选择的任何时刻,如果出现所选的值比要求的重量大,就可以直接跳过寻找下一个数据项
4 如果第一个数据项把所有方案遍历了一遍没有匹配的话就转到下一个数据项
5 如果所有方案试过以后没有结果就输出false
*/
public class MatchBag02 {
public static void main(String[] args) {
BagQuestion bq = new BagQuestion();
int [] items = {11,8,7,6,5};
int target = 20;
bq.getResult(items,0,target);
}
}
class BagQuestion {
private ArrayList<Integer> arr = new ArrayList<Integer>();
public void getResult(int [] items,int low, int target) {
if (matchBag(items,low,target) == false) {
System.out.println("没有合适的组合");
}else {
System.out.println("答案为:");
for (int i=0;i <arr.size() ;i ++ ) {
if(i == arr.size() - 1) {
System.out.println(arr.get(i));
}else {
System.out.print( arr.get(i) + ",");
}
}
}
}
public boolean matchBag(int[] items, int low ,int target) {
//用递归的方法是需要终止递归的条件的
// if(low == items.length-1 ) {
// if(items[low] == target) {
// return true;
// }else {
// return false;
// }
// }else {
//
// } 这个判断条件不行
if(items[low] == target && low < items.length)
{//遇到相等就可以停止工作,输出true;
arr.add(items[low]);
return true;
}else if(low >= items.length-1) {//如果到了数组的末尾还没有匹配到就输出false;
return false;
}else if(items[low] > target) {//如果该数比目标值大就转到下一个元素
return matchBag(items,low+1,target);
}else {
for(int i = low +1;i < items.length; i ++) {//从他的下一个元素开始遍历匹配,如果有,则添加这个元素并输出true;
if(matchBag(items,i,target - items[low])) {
arr.add(items[low]);
return true;
}
}
return matchBag(items , low + 1 , target);//如果遍历完了这个数组依旧没有合适的匹配组合,则舍弃这个数据元素转到下一个元素
}
}
}
package com.ygx.day2;
import java.util.ArrayList;
public class Demo04_Circle {
/**
*约瑟夫环问题
*/
public static void main(String[] args) {
int count = 0;
int modCount = 0;
ArrayList<Integer> list = new ArrayList<>();
for(int i = 1; i <=100; i++) {
list.add(i);
}
while(modCount < 99) {
for(int i = 0; i < list.size(); i++) {
if(list.get(i) != 0) {
//有人存在才会数.等于0就直接跳过;
count ++;
if(count % 3 == 0) {
System.out.println(list.get(i) + "出局");
list.set(i, 0);
modCount++;
}
}
}
}
System.out.println("------------------");
for (Integer integer : list) {
//打印一下最后还剩下谁?
if(integer != 0) {
System.out.println(integer);
}
}
}
}
相关文章推荐
- 赛马会面试题
- 45. Jump Game II
- scanf读取数值类型数据会在缓冲区中留下'\n'
- Android Accessibility(辅助功能) --实现Android应用自动安装、卸载、强行停止
- 分布式系统架构——dubbo与SSM整合问题
- 博客正在开通中!
- 数据结构-简单的链表结构
- java开篇三两事
- C语言main()函数详解
- 从源码了解Volley
- oracle用户创建及权限设置
- idea自动生成junit测试代码配置
- K - 卿大爷的三个女友(待续)
- RecyclerView的使用与深入分析
- Eclipse快捷键 10个最有用的快捷键
- EPOLL事件之EPOLLRDHUP
- JAVA多线程
- 个人工作总结10(第二阶段)
- NSURLSession
- JS数据交互:动态从数据库中获取数据填充Select