固定值 基础数据
养老   医疗   失业   生育   工伤
400    180    40      16     10根据上面的固定值基础数据给出一个总数,满足任意一个或多个值相加等于总数就返回各个值,没有参与到相加里面的就为0
例如:
总数 466 ,返回的是  400 + 0   + 40  + 16 + 10
总数 580 ,返回的是  400 + 180 + 0   + 0  + 0
总数 440 ,返回的是  400 + 0   + 40  + 0  + 0依次类推,还望各位大侠指点指点~

解决方案 »

  1.   

    请google : 0-1背包问题
      

  2.   

    算法思想不难。
    400*a+180*b+40*c+16*d+10*e = Z(总数)
    第一步:z-400*a>=0;求出a的值
    第二步:(z-400*a)-180*b>=0;求出b的值
    ...
    最后打印a/b/c/d/e中大于0的就是了。
      

  3.   

    还是上代码吧,前提是基础数据以降序排列。public class Test {
    static int[] num = new int[]{400,180,40,16,10};
    static final String NO_RESULT = "没有结果";

    public static void main(String[] args) {
    System.out.println(check(num,466));
    System.out.println(check(num,580));
    System.out.println(check(num,440));
    System.out.println(check(num,210));
    }

    static String check(int[] num,int value){
    int sum = 0;
    int[] addNum = new int[]{0,0,0,0,0};
    for(int i = 0;i < num.length;i++){
    if(num[i] > value)
    continue;
    sum += num[i];
    addNum[i] = num[i];
    if(sum == value){
    StringBuffer result = new StringBuffer("总数 " + value + " 返回的是");
    for(int j = 0;j < addNum.length - 1;j++){
    result.append(addNum[j] + " + ");
    }
    result.append(addNum[addNum.length - 1]);
    return result.toString();
    }
    else if(sum > value){
    sum -= num[i];
    addNum[i] = 0;
    }
    }
    return NO_RESULT;
    }
    }
      

  4.   

    乖,太谢谢了,尤其是这几位
    zyc13701469860
    OnEstepEnD
    k3108001263
    嘿嘿
    zyc13701469860谢谢你上代码,我来试试~
    稍候给分
      

  5.   

    5楼的思路没问题,但是刚又仔细看了下问题,貌似,5楼说的 a b c d e默认就是1,那问题就更简单了。