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

本文介绍了一个结合了01背包和完全背包的算法问题,并通过Java实现了解决方案。该问题涉及给定货币组合,其中一些货币只能使用一次,而另一些则可以无限次使用。通过动态规划方法,程序计算出特定金额的所有可能组合数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



分析:

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);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值