3 条题解

  • 0
    @ 2023-1-1 14:03:20
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define endl '\n'
    const int N = 35, M = 205;
    int m, n, v[N], w[N], dp[N][M], ans[N], t; // dp[i][j] 前i个物品在j的背包容量下价值最大值
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cin >> m >> n;
    	for (int i = 1; i <= n; i++)
    		cin >> v[i] >> w[i];
    	// 使用二维数组DP 便于输出路径
    	for (int i = 1; i <= n; i++)
    	{
    		for (int j = 1; j <= m; j++)
    		{
    			if (v[i] > j)
    				dp[i][j] = dp[i - 1][j];
    			else
    				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i]);
    		}
    	}
    	int res = dp[n][m];
    	// 输出路径
    	while (n && m)
    	{
    		if (dp[n][m] == dp[n - 1][m - v[n]] + w[n]) // 判断是否选择了当前物品
    			ans[++t] = n, m -= v[n];				// 记录路径 更新当前总价值
    		n--;
    	}
    	cout << res << endl
    		 << t << endl;
    	for (int i = t; i >= 1; i--)
    		cout << ans[i] << " ";
    }
    

    信息

    ID
    1203
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    43
    已通过
    20
    上传者