面试笔试遇到的一些题(3)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值