码迷,mamicode.com
首页 > 其他好文 > 详细

P1049装箱问题

时间:2019-07-23 00:27:40      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:注意   names   pac   多少   自己   贪心   style   题目   code   

这是一道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装箱问题

标签:注意   names   pac   多少   自己   贪心   style   题目   code   

原文地址:https://www.cnblogs.com/china-mjr/p/11229182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!