1,.N(1<=N<=9)个小熊分一堆苹果,第一只小熊将苹果分成N份,多了一个,扔掉,然后拿走自己的那一份。第二只熊将剩余的苹果分成N份,又多了一个,扔掉,然后拿走自己的那一份,第三只.....,直到第N只熊;问最初的苹果有多少个?
public static int n =6; static void Main(string[] args) { for (int i = 15550; i <= Int32.MaxValue; i++) { if (solve(i*3+1)) { Console.WriteLine(n + " " + (i * 3 + 1)); break; } } } public static bool solve(int apple) { int b1 = (apple - 1) / 3; for (int i = 2; i < n + 1; i++) { if (!(((Math.Pow(n - 1, i - 1)) * (apple + n - 1)) % (Math.Pow(n, i)) == 0)) { return false; } } return true; }
2.6*6的矩阵,从左上方开始,只经过向下或向右的步骤,到达右下方,找出经过的位置的最大价值;
200,120,400,150,180,300
150,250,360,120,200,130
350,300,250,100,500,260
100,150,260,320,100,150
500,130,260,100,200,170
160,100,250,200,600,200
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace test2 { class Program { static void Main(string[] args) { int[][] value = new int[][] {new int[]{200,120,400,150,180,300}, new int[] {150,250,360,120,200,130}, new int[] {350,300,250,100,500,260}, new int[] {100,150,260,320,100,150}, new int[] {500,130,260,100,200,170}, new int[] {160,100,250,200,600,200}}; work(value); //show(value); } public static int work(int[][] value){ int[][] maxValue = new int[][]{ new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, }; int[][] path = new int[][]{ new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, }; maxValue[0][0] = value[0][0]; for (int i = 1; i < 6; i++) { maxValue[0][i] = value[0][i]+maxValue[0][i-1]; path[0][i] =1; } for (int i = 1; i < 6; i++) { maxValue[i][0] = value[i][0]+maxValue[i-1][0]; path[0][i] = 1; } for (int i = 1; i < 6; i++) { for (int j = 1; j < 6; j++) { maxValue[i][j] =Math.Max(maxValue[i-1][j], maxValue[i][j-1])+value[i][j]; if (maxValue[i - 1][j] > maxValue[i][j - 1]) { path[i][j] = 0; } else { path[i][j] = 1; } } } show(maxValue); Console.WriteLine(); show(path); Console.WriteLine(); showstr(path); return maxValue[5][5]; } public static void show(int[][] mar) { foreach (int[] i in mar) { foreach (int x in i) { Console.Write(x.ToString() + " "); } Console.WriteLine(); } } public static void showstr(int[][] mar) { int[][] path = new int[][]{ new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, new int[]{0,0,0,0,0,0}, }; mar[0][0] = 1; mar[5][5] = 1; int i = 5; int j = 5; while (true) { if (!(i == 0 & j == 0)) { if (mar[i][j] == 0) { path[--i][j] = 1; } else { path[i][--j] = 1; } } else { break; } } show(path); } } }
思路最上,最左向右累加,其他部分取上方左方最大,累加下去。
路径思路,上面向右设为1,向下设为0,在第二个矩阵里进值,路径自最右下开始按方向开始,本题左左左上上上上上左左。结果为矩阵三