背包问题是动态规划的一种

//求2022内的质数的最大个数
//01背包
import java.util.*;

public class Main {
    public static boolean is_Prime(int x){
        for(int i=2;i*i<=x;i++){
            if(x%i==0) return false;
        }
        return true;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] dp = new int[2023];
        List<Integer> list=new ArrayList<>();
        for (int i = 2; i < 2023; i++) {
            if(is_Prime(i)) list.add(i);
        }

        for(int i=2;i<=2022;i++){
            Arrays.fill(dp,-1);
        }
        dp[0]=0;
        for(int i=0;i<list.size();i++){
            for(int j=2022;j>=list.get(i);j--){
                if(dp[j-list.get(i)]!=-1)
                    dp[j]=Math.max(dp[j],dp[j-list.get(i)]+1);
            }
            System.out.print(list.get(i)+" ");
        }
        System.out.println(dp[2022]);
        sc.close();
    }
}
//划分权重
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int[] num=new int[]{5160,9191,6410,4657,7492,1531,8854,1253,4520,9231,1266,4801,3484,4323,5070,1789, 2744, 5959, 9426, 4433,
                4404, 5291 ,2470 ,8533, 7608 ,2935 ,8922 ,5273 ,8364 ,8819, 7374, 8077 ,5336 ,8495 ,5602, 6553, 3548, 5267, 9150 ,3309};
        long sums=0;
        for(int i:num){
            sums+=i;
        }
        long target=sums/2;
        int[] dp=new int[(int)(target+1)];
      
        for(int i=0;i<num.length;i++){
            for(int j=(int)target;j>=num[i];j--){
                dp[j]= Math.max(dp[j],dp[j-num[i]]+num[i]);
            }
        }
        long ans=dp[(int)target]*(sums-dp[(int)target]);
        System.out.println(ans);
    }
}

 

posted on 2025-05-13 22:00  fafrkvit  阅读(14)  评论(3)    收藏  举报