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

    可做hdu2602:http://acm.hdu.edu.cn/showproblem.php?pid=2602

    代码1:

    #include <fstream>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    
    using namespace std;
    #define N 1007
    
    int c[N],w[N],dp[N][N];
    
    int main(){
        //freopen("D:\input.in","r",stdin);
        int t,i,n,V,v;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d",&n,&V);
            for(i=1;i<=n;i++)
                scanf("%d",&c[i]);
            for(i=1;i<=n;i++)
                scanf("%d",&w[i]);
            for(i=0;i<=V;i++)
                dp[0][i]=0;
            for(i=1;i<=n;i++){
                for(v=0;v<=V;v++){
                    if(v>=w[i])
                        dp[i][v] = max(dp[i-1][v],dp[i-1][v-w[i]]+c[i]);
                    else
                        dp[i][v] = dp[i-1][v];
                }
            }
            printf("%d
    ",dp[n][V]);
        }
        return 0;
    }

    代码2(空间优化):

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define N 1007
    
    int c[N],w[N],dp[N];
    
    int main(){
        int t,i,n,V,v;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d",&n,&V);
            for(i=1;i<=n;i++)
                scanf("%d",&c[i]);
            for(i=1;i<=n;i++)
                scanf("%d",&w[i]);
            memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++){
                for(v=V;v>=w[i];v--)
                    dp[v] = max(dp[v],dp[v-w[i]]+c[i]);
            }
            printf("%d
    ",dp[V]);
        }
        return 0;
    }

    恰好装满版本:

    #include <fstream>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    
    using namespace std;
    #define N 1007
    #define INF 0x7fffffff
    
    int c[N],w[N],dp[N];
    
    int main(){
        int t,i,n,V,v;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d",&n,&V);
            for(i=1;i<=n;i++)
                scanf("%d",&c[i]);
            for(i=1;i<=n;i++)
                scanf("%d",&w[i]);
            dp[0]=0;
            for(i=1;i<=V;i++)
                dp[i]=-INF;
            for(i=1;i<=n;i++)
                for(v=V;v>=w[i];v--)
                    dp[v] = max(dp[v],dp[v-w[i]]+c[i]);
            n=dp[V];
            if(n>0)
                printf("%d
    ",n);
            else
                printf("无法恰好装满!
    ");
        }
        return 0;
    }
  • 相关阅读:
    linux sleep用法
    linux下set命令的参数及用法
    给vim编辑器自动添加行号
    linux一些基本常识(三)
    shell脚本面试题
    linux下字符串的比较方式
    浅谈Windows API编程
    WIN32 API ------ 最简单的Windows窗口封装类
    Microsoft函数调用约定
    Android UI 设计规范
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4518652.html
Copyright © 2011-2022 走看看