这学期才开始学算法,学的不好,做题碰到了这道背包问题,用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;
}
}