题解 | #称砝码,背包问题,动态规划#

称砝码

http://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c

import java.util.* ;
public class Main{
    public static void main(String...args) {
        Scanner sc = new Scanner(System.in) ;
        while(sc.hasNextLine()) {
            Integer n = Integer.parseInt(sc.nextLine()) ;
            int W[] = new int[n] ;
            int T[] = new int[n] ;
            for(int i = 0 ; i < n ; i ++) {
                W[i] = sc.nextInt();
            }
            sc.nextLine() ;
            for(int i = 0 ; i < n ; i ++) {
                T[i] = sc.nextInt();
            }
            sc.nextLine() ;
            int count = 0 ;//总个数
            int sum = 0 ;//总重量(背包的总沉重)
            for(int i = 0 ; i < n ; i ++) {
                sum += W[i]*T[i] ;
                count += T[i] ;
            }
            //把砝码平摊开表示,每个砝码当成互相独立的砝码
            int W2[] = new int[count] ;//1,1,2
            int t = 0 ;
            for(int i = 0 ; i < n ; i ++) {
                for(int j = 0 ; j < T[i] ; j ++) {
                    W2[t++] = W[i] ;
                }
            }
            System.out.println(haoManyDiff(W2,sum)) ;
        }
    }
    public static int haoManyDiff(int[] W , int all) {
        int len = W.length ; 
        boolean f[][] = new boolean[len+1][all+1] ;//f[i][j]表示前i个砝码,能否拼出重量j
        f[0][0] = true ;
        for(int i = 1 ; i <= all ; i ++) {//注意:从1开始,因为f[0][0]已经初始化了
            f[0][i] = false ;
        }
        for(int i = 1 ; i <= len ; i ++) {
            for(int j = 0 ; j <= all ; j ++) {
                //转移方程,第i-1个物品,可能放得下,可能放不下
                //f[i][j] = f[i-1][j]&nbs***bsp;f[i-1][j-W[i-1]]
                f[i][j] = f[i-1][j] ;
                if(j >= W[i-1]) {
                     f[i][j] = f[i][j] || f[i-1][j-W[i-1]] ;
                }
            }
        }
        int ret = 0 ;
        for(int i = 0 ; i <= all ; i ++) {
            if(f[len][i]) {
                ret ++ ;
            }
        }
        return ret ;
    }
} 

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务