1 条题解

  • 1
    @ 2025-4-12 22:03:04

    C :

    #include <stdio.h>
    #define max 20
    int n,c,w[max],v[max],m[max][max]={0};
    void knapsack()
    {  int i,j;
    for (i=1; i<=n; i++)
    for (j=1; j<=c; j++)
    {   m[i][j]=m[i-1][j];
    if ( j>=w[i-1] && m[i-1][j-w[i-1]]+v[i-1]> m[i][j] ) 
    m[i][j]=m[i-1][j-w[i-1]]+v[i-1];
    }
    }
    void disp( )
    {	int i,j;
    int x[max]={0};
    i=n;
    while ( m[i][c]==m[i-1][c] ) i--;
    while (i>1)
    {	j=i-1;
    while (m[i][c]-m[j][c]!=v[i-1] && j>0)
    j--;
    x[i]=1;
    i=j;
    }
    for(i=2;i<=n;i++)
    printf("%d",x[i]);
    }
    int main( )
    {	int i,j;
     scanf("%d",&n);
    for (i=0; i<n; i++)
    scanf("%d",&v[i]);
    for (i=0; i<n; i++)
    scanf("%d",&w[i]);
    scanf("%d",&c);  
    knapsack();   
    disp();
     printf("\n");
    printf("%d\n",m[n][c]);
     return 0;
    }
    
    

    C++ :

    #include<iostream>
    using namespace std;
    int V[200][200];
    int max(int a,int b)
    {
       if(a>=b)
           return a;
       else return b;
    }
    
    int p(int n,int w[],int v[],int x[],int C)
    {
        int i,j;
        for(i=0;i<=n;i++)
            V[i][0]=0;
        for(j=0;j<=C;j++)
            V[0][j]=0;
        for(i=0;i<=n-1;i++)
    		for(j=0;j<=C;j++)
                if(j<w[i])
                    V[i][j]=V[i-1][j];
                else
                    V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
                j=C;
                for(i=n-1;i>=0;i--)
                {
                    if(V[i][j]>V[i-1][j])
                    {
                    x[i]=1;
                    j=j-w[i];
                    }
                else
                    x[i]=0;
                }
                for(i=1;i<n;i++)
                {
    				cout<<x[i];
    			}
    				cout<<"\n";
            return V[n-1][C];
            
    }
    
    int main()
    {
        int s;
        int w[15];
        int v[15];
        int x[15];
        int n,i;
        int C;
        n=5;
        cin>>n;
        for(i=0;i<n;i++)
            cin>>v[i];
        for(i=0;i<n;i++)
    		cin>>w[i];
    	cin>>C;
        s=p(n,w,v,x,C);
    	cout<<s<<"\n";
    }
    

    Java :

    
    import java.util.Scanner;
    
    //本程序取自王晓东编著“算法分析与设计”第 92 页,例
    //0-1背包问题动态规划解法
    class Math {
    
        public Math() {
        }
    
        static int min(int i, int j) {
            if (i > j) {
                return j;
            } else {
                return i;
            }
        }
    
        static int max(int i, int j) {
            if (i > j) {
                return i;
            } else {
                return j;
            }
        }
    }
    
    public class Main {
    
        public static void knapsack(int[] v, int[] w, int c, int[][] m) {
            int n = v.length - 1;
            int jMax = Math.min(w[n] - 1, c);
            for (int j = 0; j <= jMax; j++) {
                m[n][j] = 0;
            }
            for (int j = w[n]; j <= c; j++) {
                m[n][j] = v[n];
            }
            for (int i = n - 1; i > 1; i--) {
                jMax = Math.min(w[i] - 1, c);
                for (int j = 0; j <= jMax; j++) {
                    m[i][j] = m[i + 1][j];
                }
                for (int j = w[i]; j <= c; j++) {
                    m[i][j] = Math.max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);
                }
            }
            m[1][c] = m[2][c];
            if (c >= w[1]) {
                m[1][c] = Math.max(m[1][c], m[2][c - w[1]] + v[1]);
            }
        }
    
        public static void traceback(int[][] m, int[] w, int c, int[] x) {
            int n = w.length - 1;
            for (int i = 0; i < n; i++) {
                if (m[i][c] == m[i + 1][c]) {
                    x[i] = 0;
                } else {
                    x[i] = 1;
                    c -= w[i];
                }
            }
            x[n] = (m[n][c] > 0) ? 1 : 0;
        }
    
        public static void main(String args[]) {
            
           // int c1 = 10;
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int v1[] = new int[n];//{0,6, 3, 5, 4, 6};
            int w1[] = new int[n];//{0,2, 2, 6, 5, 4};
            for(int i=0;i<n;i++)
            {
                v1[i]=sc.nextInt();
            }
              for(int i=0;i<n;i++)
            {
                w1[i]=sc.nextInt();
            }
              int c1 = sc.nextInt();
    //        System.out.print("v1[]={");
    //        for (int i = 0; i < v1.length; i++) {
    //            System.out.print(v1[i]);
    //        }
    //        System.out.print("}");
    //        System.out.println();
    //        System.out.print("w1[]={");
    //        for (int i = 0; i < w1.length; i++) {
    //            System.out.print(w1[i]);
    //        }
    //        System.out.print("}");
    //        System.out.println();
    //        System.out.println("c=" + c1);
            int n1 = v1.length - 1;
            int x1[] = new int[n1 + 1];
            int[][] m1 = new int[n1 + 1][c1 + 1];
            knapsack(v1, w1, c1, m1);
            traceback(m1, w1, c1, x1);
            for (int i = 1; i <= n1; i++) {
    //            if (x1[i] == 1) {
                    System.out.print(x1[i]);
    //            }
            }
            System.out.println();
            System.out.println(m1[1][c1]);
        }
    }
    
    • 1

    信息

    ID
    2608
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    6
    已通过
    3
    上传者