1 条题解

  • 0
    @ 2020-03-02 10:57:33

    简单完全背包,dp[i]表示当体力为i时的最大价值,则有:\[ dp(j)=\max(dp(j),dp(j-B_i)+A_i) \]

    再从前往后找一遍最小可行值就行了,我是用顺序查找的,貌似可以二分。

    最后贴上高清无注释代码。

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #define For(i,j,k) for(int i=j;i<=(k);++i)
    using namespace std;
    typedef long long ll;
    inline int read(){
        int x=0,w=0;char c=getchar();
        for(;c<'0'||c>'9';w^=c=='-',c=getchar());
        for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^48),c=getchar());
        return w?-x:x;
    }
    int qpow(int n,int m,int k){ //n^m%k
        if(m==0) return 1;
        int ans=qpow(n,m/2,k)%k;
        if(m%2) return ans*ans%k*ans%k;
        return ans*ans%k;
    }
    int dp[500005];
    int main(){
        int v,n;scanf("%d%d",&v,&n);
        while(n--){
            int a,b;scanf("%d%d",&a,&b);
            for(int i=b;i<=500000;++i){
                dp[i]=max(dp[i],dp[i-b]+a);
            }
        }
        for(int i=0;i<=500000;++i){
            if(dp[i]>=v){
                printf("%d",i);
                return 0;
            }
        }
        return 0;
    }
    
  • 1

信息

ID
1014
难度
6
分类
动态规划 点击显示
标签
递交数
19
已通过
5
通过率
26%
上传者