文章

6

粉丝

38

获赞

1

访问

2.7k

头像
简单背包问题 题解:
P1035
发布于2024年4月21日 20:29
阅读数 557

代码:

#include <iostream>
#include <vector>
using namespace std;

bool canAchieveSum(const vector<int>& weights, int s) {
    // 创建动态规划数组,大小为s+1
    vector<bool> dp(s + 1, false);
    dp[0] = true; // 初始化,0重量总是可达的

    // 遍历每个物品
    for (int weight : weights) {
        // 从后往前更新dp数组
        for (int j = s; j >= weight; j--) {
            if (dp[j - weight]) {
                dp[j] = true;
            }
        }
    }

    // 返回能否恰好拼凑出重量s
    return dp[s];
}

int main() {
    int s, n;
    while (cin >> s >> n) {
        vector<int> weights(n);
        for (int i = 0; i < n; ++i) {
            cin >> weights[i];
        }
        // 判断是否可以凑出重量s
        if (canAchieveSum(weights, s)) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }
    return 0;
}


 

核心代码的思路:

假设我们有一个背包,最大承重为 s = 20,物品的重量分别为 [...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发