zoukankan      html  css  js  c++  java
  • E

    题目链接

    题目大意

    给你一n(n<=100)个物品,物品价值最大为1e3,物品体积最多为1e9,背包最大为1e9

    题目思路

    如果按照平常的背包来算那么时间复杂度直接O(1e11)

    这个你观察就发现其实最大的价值没超过1e5

    那么你可以改变你的dp方程来求解

    设dp[i]表示获得价值i的最小物品体积即可

    代码

    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<unordered_map>
    #define fi first
    #define se second
    #define debug printf(" I am here
    ");
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int maxn=1e5+500,inf=0x3f3f3f3f,mod=1e9+7;
    const double eps=1e-10;
    int n,sum;
    int w[maxn],v[maxn];
    ll dp[maxn];
    signed main(){
        scanf("%d%d",&n,&sum);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&w[i],&v[i]);
        }
        memset(dp,0x3f,sizeof(dp));
        dp[0]=0;
        for(int i=1;i<=n;i++){
            for(int j=1e5;j>=v[i];j--){
                dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
            }
        }
        for(int i=1e5;i>=0;i--){
            if(dp[i]<=sum){
                printf("%d
    ",i);
                break;
            }
        }
        return 0;
    }
    
    
    卷也卷不过,躺又躺不平
  • 相关阅读:
    Oracle(日期函数)
    Oracle(数值函数)
    Oracle(字符函数)
    Oracle(order by)
    Oracle(限定查询2)
    Oracle(限定查询1)
    Oracle其他简单查询
    Oracle简单语句查询
    SQLPlus
    解决方案
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/13968785.html
Copyright © 2011-2022 走看看