题解 | 完全背包前置题

完全背包前置题

https://www.nowcoder.com/practice/f0b547a39938422ca79ebd2daa4b9e85

#include <iostream>
using namespace std;
using ll = long long;
const ll N = 1e3 + 5;
ll v[N];
bool dp[N];  // dp[j]表示“能否凑出总价值j”,true为可以,false为不可以

int main() {
    ll n, k;
    cin >> n >> k;
    for (ll i = 1; i <= n; i++) {
        cin >> v[i];
    }

    // 初始化dp数组:价值0不需要任何物品就能凑出,所以dp[0]=true;其他初始为false
    dp[0] = true;
    for (ll j = 1; j <= k; j++) {
        dp[j] = false;
    }

    // 完全背包的核心遍历:先遍历物品,再遍历背包容量(正序遍历容量,允许物品重复选取)
    for (ll i = 1; i <= n; i++) {  // 遍历第i种物品
        // 从v[i]开始遍历容量(容量小于v[i]时,无法选该物品)
        for (ll j = v[i]; j <= k; j++) {
            // 如果“凑出j - v[i]”是可行的,那么加上当前物品v[i]就能凑出j
            if (dp[j - v[i]]) {
                dp[j] = true;
            }
        }
    }

    // 根据dp[k]的结果输出
    if (dp[k]) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }

    return 0;
}

全部评论

相关推荐

2025-12-19 15:04
门头沟学院 Java
小肥罗:hr爱上你了,你负责吗哈哈
点赞 评论 收藏
分享
牛客36400893...:我不是这个专业的,但是简历确实没有吸引我的亮点,而且废话太多没耐心看
0offer是寒冬太冷还...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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