文章

2

粉丝

104

获赞

8

访问

2.0k

头像
简单背包问题 题解:
P1035
发布于2025年4月5日 17:38
阅读数 152

#include<bits/stdc++.h> // 包含标准库,方便使用各种功能
using namespace std;

int main(){
    int s, n; // 定义变量s表示背包的容量,n表示物品的数量
    while(cin >> s >> n){ // 多组测试数据,循环读取输入
        int a[n+1]; // 定义数组a,存储每个物品的重量,大小为n+1(方便从1开始索引)
        for(int i = 1; i <= n; i++) cin >> a[i]; // 读取每个物品的重量

        int dp[n+1][s+1]; // 定义动态规划数组dp,dp[i][j]表示考虑前i个物品时,是否能够凑出重量j
        memset(dp, 0, sizeof(dp)); // 初始化dp数组,将所有值设为0

        int flag = 0; // 标志变量,用于标记是否找到满足条件的解
        for(int i = 1; i <= n; i++){ // 遍历每个物品
            for(int j = s; j >= 0; j--){ // 遍历背包容量,从大到小(防止重复使用物品)
                if(j - a[i] >= 0) // 如果当前背包容量j能够放下第i个物品
                    dp[i][j] = max(dp[i-1][j-a[i]] + a[i], dp[i-1][j]); // 选择放入或不放入,取最大值
                else
                    dp[i][j] = dp[i-1][j]; // 如果放不下,继承之前的状态
                if(dp[i][j] == s){ // 如果当前状态已经满足背包容量s
                    flag = 1; // 设置标志变量为1
                    break; // 退出内层循环
                }
...
登录查看完整内容


登录后发布评论

1 条评论
机试过过过· VIP
2025年4月5日 17:52

我这个别看了,思路有点问题。题目的测试用例不强我才AC的,后来发现还是有问题

赞(0)