#背包#动态规划#北京大学上机题

https://www.acwing.com/problem/content/3445/

思路:对背包dp模板稍加修改,注意转移方程和初始化的方法即可

解法:新建dp数组dp[i][j],表示用i个物品凑齐j体积的方法总数,按顺序读取N和物品体积序列之后:

1.将dp数组的dp[0][0]置为0

2.用i和j进行遍历

a.对于每一个dp[i][j],首先先把dp[i-1][j](代表少一件凑齐j的方法)赋值给他,意味着这件物品不能使用,故保留上一种方法的数量

b.判断,如果此时可以使用这个物品,dp[i][j]就要再加上用i-1件物品凑齐j-arr[i]的方法

c.直到遍历结束,打印dp[n][40]即可


#include <bits/stdc++.h>

using namespace std;
int dp[50][50]; //dp[i][j]的值代表用i个物品凑齐j体积的方法数
int main(){
    int n;
    cin >> n;
    int arr[n+1];
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=40;j++){
            dp[i][j]=dp[i-1][j];
            if(j >= arr[i]){
                dp[i][j]+=dp[i-1][j-arr[i]];
            }
        }
    }
    printf("%d",dp[n][40]);
    return 0;
}

全部评论

相关推荐

(已过)笔试:合并有序链表,二叉搜索树第k大个节点,循环升序数组最小值,还有一道忘了面试:项目拷打,介绍mvvm(讲了vm处理界面显示逻辑,观察者模式这些)livedata的几个实例化方法(没答出来livedata如何实现生命周期绑定问题(大概答了在xxxactivity实现了某个借口实现了对lifecycle的处理,然后进行对数据的生命周期绑定)不活跃的观察者接收事件的问题(没太清楚问题的核心,答了粘性事件相关,生命周期改变会触发observe方法回调)retrofit的优点retrofit的动态代理怎么实现(提了一下invacationHandler,最后实现在invoke方法)协程线程的区别协程的优点介绍协程的上下文的实现(忘了glide缓存机制glide会压缩图片吗(不懂大尺寸的view加载小尺寸的图片会缩放吗(答了需要指定缩放的方式)WebView加载的优化(答了缓存复用和预启动,预启动提到了idlehandler)实现预启动如何拿到context(答了mutablecontext)介绍一下idlehandleridlehandler什么时候起作用(消息队列没东西)handle机制,死循环问题(答linux的epoll机制)epoll机制如何实现(答了读不到数据就释放cpu资源,写端有数据就唤醒)apk的体积优化(图片资源的处理,apk混淆)项目中有用过锁吗(真没有)了解哪些锁(乐观锁,悲观锁)volatile关键字的作用和实现(可见性,禁止指令重排,修改主存)synchronized底层原理了解吗(monitorenter和monitorexit指令) #面经# #Android#
点赞 评论 收藏
转发
1 1 评论
分享
牛客网
牛客企业服务