c 与python与java的算法题

假设某卡牌类游戏里面,你搜集了 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)
 
  1. Java代码:
  2. import java.util.Scanner;  
  3. public class Main {  
  4.   
  5.     public int  findNumber(int E, int n, int[] energy) {  
  6.           
  7.         if(E == 0)  
  8.             return 1;  
  9.         if( E < 0 || n <= 0)   
  10.             return 0;  
  11.           
  12.         return findNumber(E, n-1, energy) + findNumber(E - energy[n], n, energy);  
  13.     }  
  14.       
  15.       
  16.     public static void main(String[] args) {  
  17.           
  18.         int[] energy = new int[18];  
  19.         for(int i=0; i<energy.length; i++) {  
  20.             energy[i] = i*i;   
  21.         }  
  22.         Scanner sc = new Scanner(System.in);  
  23.         int E = sc.nextInt();  
  24.         Main m = new Main();  
  25.         System.out.println(m.findNumber(E, (int)Math.sqrt(E), energy));  
  26.     }  
  27. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值