题解(附思路)
2023-12-16 08:11:15
发布于:北京
41阅读
0回复
0点赞
这题一眼就能看出是01背包问题,但是跟模板不太一样:每个物品只有重量,没有价值,而且求的是背包剩余的最小容量。但你仔细思考也会发现这个问题与01背包模板题是可以转化的。既然每个物品没有价值,那么就把它们的价值定义为它们的重量,求剩余最小容量的问题就变成了求剩余最少价值。然后你会发现,用总价值减去装了的价值,就是问题的答案。总价值是什么?是背包的容量V,也就是背包装的价值上限。
所以,我们只要把这道题当作01背包模板题做就行了。
注意:把所有代表价值的数组全部换成代表重量的数组,最后的答案应该是V-dp[n][V],也就是背包容量减去最大能装的重量就是剩余最小重量。
AC代码(如果你看懂了,你应该不会抄)
#include<iostream>
using namespace std;
int V,n;
int u[44],dp[44][20040];
int main(){
cin>>V>>n;
for(int i=1;i<=n;i++) cin>>u[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=V;j++){
if(u[i]>j) dp[i][j]=dp[i-1][j];
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-u[i]]+u[i]);
}
}
cout<<V-dp[n][V];
return 0;
}
全部评论 1
打这么多字不是很容易,点个赞怎么样?
2023-12-16 来自 北京
1
有帮助,赞一个