• 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十一月,我花开后百花杀。
  • 相关阅读:
    生成对抗性网络GAN
    一些程序员好用的网站
    TED演讲积累。
    JQuery$.extend()用法
    jQuery中判断数组
    input标签中的accpet
    gitlab的添加密钥
    Linux—Ubuntu14.0.5 修改gitlab管理员的密码
    Linux—Ubuntu14.0.5安装gitlab
    Linux—Ubuntu14.0.5安装Redis
  • 原文地址:https://www.cnblogs.com/china-mjr/p/11229182.html
Copyright © 2020-2023  润新知