1、约瑟夫环问题
(1)使用java中LinkedList解决
package demo;
import java.util.LinkedList;
import java.util.Scanner;
public class yuesefu {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //人数
int k = sc.nextInt(); //淘汰数
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < n; i++) {
list.addLast(i + 1); //初始化
}
int index = 0;
while (list.size() > 1) { //最后只剩一人
for (int i = 1; i < k; i++) {
if (index == list.size() - 1) {
index = 0;
} else {
index++;
}
}
list.remove(index); //remove后后面元素前移,index不用改直接加
}
System.out.println(n + "个人,数到" + k + "淘汰,最后获胜为第" + list.get(0) + "个。");
}
}
(2)递推,假设10人,数到3淘汰。
f(1,3) =1 下标从1开始
f(2,3)=(f(1,3)-1+3)%2+1=2
f(3,3)=(f(2,3)-1+3)%3+1=2
f(4,3)=(f(3,3)-1+3)%4+1=1
…
f(n,3)=(f(n-1,3)-1+3)%n+1
淘汰一人后,后面的人前移了3位,胜利者也前移了3位,逆过来,人多时往后移3位.淘汰一人就是往前移动k位。
整个公式为f(n,k)=(f(n-1,k)-1+k)%n+1
下标从0开始 f(n,k)=(f(n-1,k)+k)%n 最后结果加1
package demo;
import java.util.Scanner;
public class yuesefu2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int result = 1;
// int result=0;
for (int i = 2; i <= n; i++) {
result = (result - 1 + k) % i + 1;
// result=(result+k)%i;
}
System.out.println(result);
// System.out.println(result+1);
}
}
2、0-1背包,n个物品,每个物品价值v和重量w不同,装入容量为c的包,所装物品价值最大。
动态规划 状态方程f[i][c]=max{f[i-1][c],f[i-1][c-w[i]]+v[i]}
1、第i件不放进去,这时所得价值为:f[i-1][c]
2、第i件放进去,这时所得价值为:f[i-1][c-w[i]]+v[i]
package demo;
public class package01 {
public static int knapsack(int[] w, int[] v, int c) {
int n = w.length;
int[][] maxvalue = new int[n + 1][c + 1]; // 重量和物品为0时,价值为0
for (int i = 0; i < c + 1; i++) {
maxvalue[0][i] = 0;
}
for (int i = 0; i < n + 1; i++) {
maxvalue[i][0] = 0;
}
for (int i = 1; i <= n; i++) { // n件物品,j为能取的总重量为j
for (int j = 1; j <= c; j++) { // 当前最大价值等于放上一件的最大价值
maxvalue[i][j] = maxvalue[i - 1][j]; // 如果当前件的重量小于总重量,可以放进去或者拿出别的东西再放进去
if (w[i - 1] <= j) { // 两种情况比较
if (maxvalue[i - 1][j - w[i - 1]] + v[i - 1] > maxvalue[i - 1][j]) {
maxvalue[i][j] = maxvalue[i - 1][j - w[i - 1]] + v[i - 1];
}
}
}
}
return maxvalue[n][c];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int w[] = { 2, 3, 4, 5 };
int v[] = { 3, 4, 5, 7 };
int c = 9;
System.out.println(knapsack(w, v, c));
}
}
参考:https://blog.csdn.net/likunkun__/article/details/80223003