题解 | #【模板】01背包#
【模板】01背包
https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e
01背包模板思路
const auto io_sync_off=[]() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return nullptr;
}();
int w[1000];
int v[1000];
int dp[1000];
int main()
{
int n,V;
cin>>n>>V;
for(int i=0;i<n;i++) {
cin>>v[i]>>w[i];
}
// 0表示可以从任意状态转移到 j
memset(dp,0,sizeof dp);
for(int i=0;i<n;i++) {
//由于每个物品只能用一次,为了防止重复计算,需要倒序遍历
for(int j=V;j>=v[i];j--) {
//状态转移,要么选择第i件物品,要么不选,取价值最大的
dp[j] = max(dp[j],dp[j-v[i]] + w[i]);
}
}
int mx=dp[V];
// 所有的状态都不可达,将0置为0, 即 所有的 j状态必须都要从0转移过去
memset(dp,-0x3f,sizeof dp);
dp[0] = 0;
for(int i=0;i<n;i++) {
for(int j=V;j>=v[i];j--) {
dp[j] = max(dp[j],dp[j-v[i]] + w[i]);
}
}
printf("%d\n%d\n", max(mx,0), max(dp[V],0));
}
算法常用解题技巧 文章被收录于专栏
算法常用解题技巧
