zoukankan      html  css  js  c++  java
  • 01背包例题

    大大的去了:

    洛谷P1049

    传送门

    二维数组题解:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int v,n;//V表示箱子容量,n表示物品数量
        int a[35];//物品体积
        int f[35][20005];
        cin>>v>>n;
    
        for(int i=1;i<=n;i++)
        cin>>a[i];
    
        for(int i=1;i<=n;i++)
        for(int j=a[i];j<=v;j++)
        //或者:for(int j=v;j>=a[i];j--)//
        f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+a[i]);
    
        cout<<v-f[v];//注意,要输出剩余体积,而不是f[v]!
    }

    一维数组题解:

    #include<iostream>
    using namespace std;
    int v,n;
    int s[40];
    int f[2000020];
    int main()
    {
        cin>>v>>n;
        for(int i=1;i<=n;i++)
        cin>>s[i];
        for(int i=1;i<=n;i++)
        {
            for(int j=v;j>=s[i];j--)
            {
                if(f[j]<f[j-s[i]]+s[i])
                {
                    f[j]=f[j-s[i]]+s[i];
                }
            }
        } 
        cout<<v-f[v];
        return 0;
    }

    第二题:

    洛谷P1164

    传送门ლ(′◉❥◉`ლ)

    按照大佬们的说法,这是一题奇妙的01背包水题

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=10000+10;
    int v[maxn],f[maxn];
    int main(){
        int n,m;
        cin>>n>>m;
        f[0]=1;
        for(int i=1;i<=n;++i)    
            cin>>v[i];//读入 价值
        for(int i=1;i<=n;++i)
            for(int j=m;j>=v[i];--j)
                f[j]+=f[j-v[i]];//现在的花费+=我不点这个菜的时候的花费
        cout<<f[m]<<endl;最后把最后一个点的花费输出来就可以了
        return 0;
    }
  • 相关阅读:
    compose 函数实现
    垂直居中的实现方式
    数组去重方法总结
    前端性能优化
    简简单单的几个正则表达式
    ES6
    Vue不兼容IE8原因以及Object.defineProperty详解
    Vuex(二)——关于store
    Vuex(一)——vuejs的状态管理模式
    关于REST的浅显了解
  • 原文地址:https://www.cnblogs.com/U58223-luogu/p/9538060.html
Copyright © 2011-2022 走看看