SDIBT 1350 最小重量机器设计问题

来源:互联网 发布:宝山区行知实验幼儿园 编辑:程序博客网 时间:2024/06/07 22:31

试题连接:http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=1350

 

最小重量机器设计问题

Time Limit: 2 Sec  Memory Limit: 64 MB
Submit: 86  Solved: 7
[Submit][Status][Discuss]

Description

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设 wij 是从供应商j 处购得的部件i的重量,cij 是相应的价格。

试设计一个回溯算法,给出总价格不超过d的最小重量机器设计。

对于给定的机器部件重量和机器部件价格,计算总价格不超过d的最小重量机器设计。

Input

输入数据的第一行有3 个正整数n ,m和d(n,m≤20,d≤200)。接下来的2n 行,每行m个数。前n行是c,后n行是w。

Output

输出数据有两行,第一行为计算出的最小重量,第二行是每个部件的供应商,每个供应商之间用空格分隔。

Sample Input

3 3 41 2 33 2 12 2 21 2 33 2 12 2 2

Sample Output

41 3 1

 

试题答案:

package sdibt;import java.util.Scanner;public class Sdibt_1508_20130502 {public static int[][] c;//价值public static int[][] w;//重量public static int minw;//最优重量public static int minc;//最小价值public static int minwTemp;//递归中满足要求的重量public static int mincTemp;//递归中满足要求的价值public static int[] result;//最终结果public static int[] resultTemp;//中间保存结果public static int n;//n种零件public static int m;//m个分销商public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNextInt()) {n = sc.nextInt();m = sc.nextInt();minc = sc.nextInt();init();//如果一开始最大的价格都要比给定的价格小,那么可以直接输出最小值,预处理判断也是搜索剪枝当中非常重要的一个方法。int min=0, max=0, tempmin, tempmax;for(int i=0; i<n; i++) {tempmax = 0;for(int j=0; j<m; j++) {c[i][j] = sc.nextInt();if(tempmax < c[i][j]) tempmax = c[i][j];}max += tempmax;}for(int i=0; i<n; i++) {tempmin = Integer.MAX_VALUE;for(int j=0; j<m; j++) {w[i][j] = sc.nextInt();if(tempmin > w[i][j]) {tempmin = w[i][j];result[i] = j+1;}}min += tempmin;}if(max > minc) { backtract(0);} else {minw = min;}show();}}private static void show() {System.out.println(minw);for(int i=0; i<n; i++) {System.out.print(result[i] + " ");}}private static void backtract(int level) {if(level >= n) {if(minwTemp<minw && mincTemp<=minc) {minw = minwTemp;for(int i=0; i<n; i++) {result[i] = resultTemp[i]+1;}}return;} //当前重量值已经比最小重量值大了,或者现有价格>给定价格,就没有必要继续了if(minwTemp>minw || mincTemp>minc) return;for(int i=0; i<m; i++) {if(mincTemp+c[level][i]<=minc) {mincTemp += c[level][i];minwTemp += w[level][i];resultTemp[level] = i;backtract(level+1);mincTemp -= c[level][i];minwTemp -= w[level][i];}}}private static void init() {c = new int[n][m];w = new int[n][m];result = new int[n];resultTemp = new int[n];minw = Integer.MAX_VALUE;minwTemp = 0;mincTemp = 0;}}
原创粉丝点击