zoukankan      html  css  js  c++  java
  • 【背包九讲专题】完全背包

    暴力朴素无优化写法(3维for+2维数组):

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+5;
    int dp[maxn][maxn];
    int v[maxn],w[maxn];
    int main(){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);
        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                for(int k=0;k*v[i]<=j;k++){
                    dp[i][j]=max(dp[i][j],dp[i-1][j-k*v[i]]+k*w[i]);
                }
            }
        }
        cout<<dp[n][m]<<endl;
    } 
    View Code

    过程优化步骤(2维for+2维数组):

     

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+5;
    int dp[maxn][maxn];
    int v[maxn],w[maxn];
    int main(){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);
        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                dp[i][j]=dp[i-1][j];
                if(j>=v[i]) dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);
            }
        }
        cout<<dp[n][m]<<endl;
    } 
    View Code

    最终优化(2维for+1维数组):

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+5;
    int dp[maxn];
    int v[maxn],w[maxn];
    int main(){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);
        for(int i=1;i<=n;i++){
            for(int j=v[i];j<=m;j++){
                dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
            }
        }
        cout<<dp[m]<<endl;
    } 
    View Code
    Codeforces ID:Anonytt QQ: 847399102 可以添加&关注
  • 相关阅读:
    基于vue的购物车清单
    圣杯布局和双飞翼布局
    正则限制input负数输入
    vue.js devtools图标不亮
    将二维数组转换成一维数组(基于reduce)
    基于PROMISE解决回调地狱问题
    封装AJAX库(参考JQ)
    for in和for of的区别
    抢购倒计时的实现
    git clone --depth=1 后获取其他分支
  • 原文地址:https://www.cnblogs.com/Anonytt/p/14368651.html
Copyright © 2011-2022 走看看