今日头条2018_春招实习_编程2(混合货币组合,混合背包问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiakexiaohu/article/details/79952435



分析:

package 实习面试笔试题.今日;

import java.util.Scanner;

public class Main2_01背包和完全背包混合 {
    //01背包和完全背包组合
    //给定货币组合,有些货币可以取一次,有些货币可以取多次
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        int count=sc.nextInt();

        int [] nums=new int[n+m];
        //普通币
        for(int i=0;i<n;i++){
            nums[i]=sc.nextInt();
        }
        //纪念币
        for(int j=n;j<n+m;j++){
            nums[j]=sc.nextInt();
        }


        int [] dp=new int[count+1];
        //初始化,因为0的金额只有一种
        dp[0]=1;

        for(int i=0;i<n+m;i++){
            if(i<n){
                //普通货币,完全背包
                for(int j=1;j<=count;j++){
                    if(j>=nums[i]){
                        //因为是求组合总数
                        dp[j]=dp[j]+dp[j-nums[i]];
                    }
                }
            }else if(i<n+m){
                //纪念币,01背包
                for(int j=count;j>=1;j--){
                    if(j>=nums[i]){
                        dp[j]=dp[j]+dp[j-nums[i]];
                    }
                }
            }
        }
        System.out.println(dp[count]%1000000007);
    }

}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页