题目及解析(利用BFS解决背包问题)
-
import java.util.Scanner; public class dfsbeibao { static final int maxn = 30; static int n, V, maxValue = 0;//物品件数是n,背包容量是v,最大价值maxValue static int[] w = new int[maxn];//w[i]表示第i个物品的重量 static int[] c = new int[maxn];//c[i]表示第i个物品的价值 public static void dfs(int index, int sumW, int sumC) { if(index == n) { if(sumW <= V && sumC > maxValue) { maxValue = sumC; } return ; } dfs(index + 1, sumW, sumC);//不选第i件物品 dfs(index + 1, sumW + w[index], sumC + c[index]);//选第i件物品 } public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); V = sc.nextInt(); for(int i = 0;i < n;i++) { int temp = sc.nextInt(); w[i] = temp; } for(int i = 0;i < n;i++) { int temp = sc.nextInt(); c[i] = temp; } dfs(0, 0, 0); System.out.println("最大价值:"+maxValue); } } 输入: 5 8 //代表5个物品,背包容量为8 3 5 1 2 2 //输入各物品的重量 4 5 2 1 3 //输入各物品的价值 输出: 最大价值:10
心得:BFS的思想在于不断地沿着某一固定的方向往深处搜索,直到遇到死胡同,经过边界处理段代码后,进行下一个岔路口的搜索,直到全部搜索完毕。