假设某卡牌类游戏里面,你搜集了 17 种卡牌,每种卡牌的攻击伤害率从小到大排列分别 为 1,4,9,… ,289,即 n 的平方(1<=n<=17,n 为正整数),并且每种卡牌的数量足够 多,现在请你计算出有多少种卡牌组合方式使得卡牌的总攻击率为 m(m<=500)比如 m=10, 那么有 4 种组合卡牌的方式,相同种卡牌可重复出现;
c代码:
python:
initype_list = [] attack_list = [] def ini(): for index in range(18): if (index > 0): initype_list.append(index) for index in initype_list: attack = index*index attack_list.append(attack) def choose_number(x): list1 = [] list_top = [] a = 0 for index1 in attack_list: number = x number = number - index1 for index2 in attack_list: number = number - index2 for index3 in attack_list: number = number - index3 for index4 in attack_list: if (index4 + index3 + index2 + index1 == x): list1.append(index1) list1.append(index2) list1.append(index3) list1.append(index4) list1.sort() list = list1.copy() if (list1 in list_top): list1.clear() else: list_top.append(list) a += 1 list1.clear() print(list_top) if (a > 0): return a else: return 0 ini() listpp = [] for x in range(289*4+1): a = choose_number(x) if (choose_number(x) > 0): print(x,a)
- Java代码:
- import java.util.Scanner;
- public class Main {
- public int findNumber(int E, int n, int[] energy) {
- if(E == 0)
- return 1;
- if( E < 0 || n <= 0)
- return 0;
- return findNumber(E, n-1, energy) + findNumber(E - energy[n], n, energy);
- }
- public static void main(String[] args) {
- int[] energy = new int[18];
- for(int i=0; i<energy.length; i++) {
- energy[i] = i*i;
- }
- Scanner sc = new Scanner(System.in);
- int E = sc.nextInt();
- Main m = new Main();
- System.out.println(m.findNumber(E, (int)Math.sqrt(E), energy));
- }
- }