欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 完全背包模板

完全背包模板

2025/6/26 8:03:08 来源:https://blog.csdn.net/chen0708chen/article/details/146540507  浏览:    关键词:完全背包模板

题目链接:【模板】完全背包

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

你有一个背包,最多能容纳的体积是V。

现在有n种物品,每种物品有任意多个,第i种物品的体积为vi​ ,价值为wi​。

(1)求这个背包至多能装多大价值的物品?

(2)若背包恰好装满,求至多能装多大价值的物品?

输入描述:

第一行两个整数n和V,表示物品个数和背包体积。

接下来n行,每行两个数vi​和wi​,表示第i种物品的体积和价值。

1≤n,V≤1000

输出描述:

输出有两行,第一行输出第一问的答案,第二行输出第二问的答案,如果无解请输出0。

示例1

输入

2 6
5 10
3 1

输出

10
2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main(){int n,V;cin >> n >> V;vector<int> v(n+1);vector<int> w(n+1);for (int i=1;i<=n;i++){cin >> v[i] >> w[i];}vector<vector<int>> dp(n+1,vector<int>(V+1,0));for (int i=1;i<=n;i++){for (int j=0;j<=V;j++){dp[i][j]=dp[i-1][j];if (j>=v[i])dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);//01背包第二个参数是dp[i-1][j-v[i]]+w[i]}}cout << dp[n][V] << endl;vector<vector<int>> dp2(n+1,vector<int>(V+1,-1));for (int i=0;i<=n;i++){dp2[i][0]=0;}for (int i=1;i<=n;i++){for (int j=0;j<=V;j++){dp2[i][j]=dp2[i-1][j];if (j>=v[i]&&dp2[i][j-v[i]]!=-1)dp2[i][j]=max(dp2[i][j],dp2[i][j-v[i]]+w[i]);//同样的,01背包这里判断条件是dp2[i-1][j-v[i]]!=-1//递推第二个数是dp2[i-1][j-v[i]]+w[i]}}if (dp2[n][V]==-1){cout << 0 << endl;}else {cout << dp2[n][V] << endl;}return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词