2 条题解

  • 0

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int dp[10005];
    int main(){
    int v,n,c,i,k,m,j,cmax=-1;
    scanf("%d%d%d",&v,&n,&c);
    for(i=1;i<=n;i++){
    scanf("%d%d",&k,&m);
    for(j=c;j>=m;j--)dp[j]=max(dp[j],dp[j-m]+k);
    }
    for(j=0;j<=c;j++)if(dp[j]>=v)cmax=max(cmax,c-j);
    dp[c]<v?printf("Impossible"):printf("%d",cmax);
    return 0;
    }

  • 0
    @ 2020-01-23 16:04:22

    01背包模板题,数据范围比较极限。

    /*
    
    */
    #define method_1
    #ifdef method_1
    /*
    
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    #include<iomanip>
    #include<ctime>
    #include<string>
    #include<bitset>
    #define D(x) cout<<#x<<" = "<<x<<"  "
    #define E cout<<endl
    using namespace std;
    typedef long long ll;
    typedef pair<int,int>pii;
    const int maxn=10000+5;
    const int maxc=10000+5;
    const int INF=0x3f3f3f3f;
    //f[j]表示背包已用容量为j的最大体积 
    int V,n,C;
    int v[maxn],c[maxn];
    int f[maxc]; 
    void dp(){
        for(int i=1;i<=n;i++){
            for(int j=C;j>=c[i];j--){
                f[j]=max(f[j],f[j-c[i]]+v[i]);
            }
        }
        for(int i=0;i<=C;i++){
            if(f[i]>=V){
                printf("%d",C-i);
                return;
            }
        }
        printf("Impossible");
    }
    int main() {
    //  ios::sync_with_stdio(false);
        //freopen("精卫填海.in","r",stdin);
        scanf("%d%d%d",&V,&n,&C);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&v[i],&c[i]);
        } 
        dp();
        return 0;
    }
    #endif
    #ifdef method_2
    /*
    
    */
    
    #endif
    #ifdef method_3
    /*
    
    */
    
    #endif
    
    
  • 1

信息

ID
1121
难度
6
分类
动态规划 | 背包 点击显示
标签
递交数
113
已通过
32
通过率
28%
上传者