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; }
待到oi十一月,我花开后百花杀。