杭电Hd 2111

这学期才开始学算法,学的不好,做题碰到了这道背包问题,用java写的,与君共勉。多多指教,共同进步

import java.util.Scanner;


public class Hd2111 {
 public static void main(String[] args){
  Scanner sc=new Scanner(System.in);
  
  while(sc.hasNext()){
  int v=sc.nextInt();
  if(v==0) break;
  int n=sc.nextInt();
     int [] a=new int[n];
     int [] b=new int[n];
     for(int i=0;i<n;i++){
      a[i]=sc.nextInt();
      b[i]=sc.nextInt();
     }          //输入数据结束,下面处理数据
  
  int total_v=knapsack(v,a,b );//调用背包算法
  System.out.println(total_v);
 }
 }
 //背包算法
 static int knapsack(int c,int[] pi,int[] mi ){
  int n=pi.length;
  qSort(pi,mi,0,pi.length-1);
  int i;
  int opt=0;  //记录价值
  for(i=0;i<n;i++){
   if(mi[i]>c) break;
   opt+=pi[i]*mi[i];
   c-=mi[i];
  }
  if(i<n){
   opt+=c*pi[i];
  }
  return opt;
 }
 //按单价降序排列
 public static void qSort(int[] a, int[] b,int p, int r) {
     if (p < r) {
   int q = partition(a, b, p, r);
   qSort(a, b, p, q - 1);
   qSort(a, b, q + 1, r);
  }
 }
 public static int partition(int[] a, int[] b,int p, int r) {
  int i = p;
  int j = r + 1;
  int x = a[p];
  while (true) {
   while (a[++i] > x && i < r);
   while (a[--j] < x);
   if (i >= j) break;
   int temp = a[j];
   a[j] = a[i];
   a[i] = temp;

      temp = b[j];
   b[j] = b[i];
   b[i] = temp;
  }
  
  int temp2 = b[j];
  b[j] = b[p];
  b[p] = temp2;

  a[p] = a[j];
  a[j] = x;
  
  return j;
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值