P1049装箱问题
Posted china-mjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1049装箱问题相关的知识,希望对你有一定的参考价值。
这是一道DP(背包)水题。
题目问剩余空间最小,那么意思为装得最多。拿到题后便习惯了用贪心去思考,发现局部并不是全局最优,所以考虑dp。但是发现01背包的价值呢?(这个错误的想法就显示了我对dp理解得不透彻)。而其实这些题的本源都在于写转移方程,于是便想了出来dp[j]=max(dp[j],dp[j-weight[i]]+weight[i]),用dp[j]来表示当背包容量为j时最大可以装多少。另外,要注意倒序,因为是类01。
1.不要光想套模板,要自己写出状态转移方程
2.贪心是一种方法,并不是每一个题都要用到
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define N 100001 using namespace std; int dp[N]; int weight[N]; int n; int T; int main()//让T最小 :装的多 cin>>T; cin>>n; for(int i=1;i<=n;i++) cin>>weight[i]; for(int i=1;i<=n;i++) for(int j=T;j>=weight[i];j--) dp[j]=max(dp[j],dp[j-weight[i]]+weight[i]); cout<<T-dp[T]; return 0;
以上是关于P1049装箱问题的主要内容,如果未能解决你的问题,请参考以下文章