10247D 2022-02-12 17:51 采纳率: 50%
浏览 31
已结题

P1314 01背包问题II

问题遇到的现象和发生背景

img

问题相关代码,请勿粘贴截图
#include<bits/stdc++.h>
using namespace std;
int w[100001],v[100001],dp[100001];
int main()
{
    int t,n,m;
    cin>>t;
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            cin>>w[i]>>v[i];
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=m;j>=w[i];j--)
            {
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            }
        }
        cout<<dp[m]<<endl;
    }
}
运行结果及报错内容

img

我的解答思路和尝试过的方法

动态规划

我想要达到的结果

img

  • 写回答

1条回答 默认 最新

  • fortunely2 2022-02-13 01:22
    关注

    你的代码有2个问题:

    1. 数组没必要开那么大,用vector存储即可。
    2. 存储状态的数组定义,以及状态转移方程是错的。

    按你的思路改写的

    int main(int argc, char *argv[])
    {
        int t, n, W;
        cin >> t; // 输入测试用例数
        while (t-- > 0)
        {
            cin >> n >> W; // 输入物品数量n、背包(剩余)重量W
            assert(n > 0);
            assert(W > 0);
            
            // 输入n个物品重量、价值
            vector<int> v(n), w(n);
            for (int i = 0; i < n; ++i)
            {
                cin >> w[i] >> v[i];
            }
    
            vector<vector<int> > c(n + 1, vector<int>(W + 1, 0)); // 全部初始化为0
            // c[i][j] 表示将前i个物品,放入背包剩余重量为j,取得的最大价值
    
            for (int i = 1; i <= n; ++i)
            {
                for (int j = 1; j <= W; ++j)
                {
                    int idx = i - 1;
                    if (j < w[idx]) // 背包剩余容量不足以放入第i个物品,只有一种选择,价值不变
                    {
                        c[i][j] = c[i - 1][j];
                    }
                    else
                    {
                        // 剩余重量足够时,有两种选择,选价值高者
                        c[i][j] = max(c[i - 1][j], c[i - 1][j - w[idx]] + v[idx]);
                    }
                }
            }
            cout << c[n][W] << endl;
        }
        return 0;    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月28日
  • 已采纳回答 2月20日
  • 创建了问题 2月12日

悬赏问题

  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗