落谷P2347_砝码称重.md

落谷P2347_砝码称重

入门动态规划

核心就是,遍历出每一种砝码的每一个重量,然后去找当前"合法重量"数组,如果找到”合法重量“

那么"合法重量"+"当前砝码的重量"=“合法数组中新的合法重量”

因为重量为零也算"合法重量",所以初始化dp[0]=1,但最后统计时题目要求排除重量为0的情况,所以不算dp[0]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class P2347_砝码称重 {
    //储存当前重量下是否成立
    static int[] dp=new int[1010];

    //储存每种砝码有几个
    static int[] ms=new int[7];

    //每种砝码的重量 从1开始
    static int[] wg={0,1,2,3,5,10,20};

    //总共有多少中重量的表达方式
    static int sum;
    static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static int nexInt() throws IOException { in.nextToken();return (int)in.nval; }

    public static void main(String[] args) throws IOException {
        dp[0]=1;//初始化为1,重量为0时也有一种
        //循环每一个种砝码
        for (int i = 1; i <=6; i++) {
            ms[i]=nexInt();

            //循环每一种砝码的每一个砝码
            for (int j = 1; j <=ms[i]; j++) {
                 //从后向前找重量成立的砝码,初始只有重量为0的成立,
                // 从后向前是因为,从前向后会不停的重复,导致结果是1000
                for (int k = 1009; k>=0; k--) {
                    //找到当前成立的重量,(成立重量+合法重量=合法解)
                    if(dp[k]>0){
                       dp[k+wg[i]]=1;
                    }
                }
            }
        }
        //遍历合法重量数组 统计所有合法的解
        for (int i = 1; i <=1009; i++) {
            sum+=dp[i];
        }
        System.out.println("Total="+sum);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值