【阿里巴巴校招】7月17日笔试凉经
第一题:(这题没写出来QAQ,我知道如何求x ^ ab的最大值,ab的值是多少)
给定一个数x,数据对 (a, b)使得a ^ b ^ x能达到最大,求使|a - b|最小的方案总数有多少。
x,a,b的范围都是0 - 2^31 次方
第二题:卖粽子(典型的背包问题)
小明要卖粽子,有m种粽子,n克面粉,多种馅料,求做出的粽子能够卖出价格最大是多少?
给定 a[] , b[], c[], d[]
其中a[i] 表示第 i 种粽子,现有馅料数目
b[i]表示第 i 种粽子,消耗多少馅料
c[i] 表示第 i 种粽子,消耗多少面粉
d[i] 表示第 i 种粽子,可以卖多少钱
ps:c[0] d[0] 表示不带陷的粽子要多少面粉,和值多少钱
有大佬看看我的代码吗????只能通过10%,然后显示超时了,难道要用二进制优化或者单调队列优化吗???
import java.util.*;
public class Main {
//a馅料数目,b消耗馅料,c消耗面粉,d价格
public static int maxValue(int[] a, int[] b, int[] c, int[] d, int V) {
//bian li v
int[] f = new int[V + 1];
//bian li shu mu
for (int i = 0; i < a.length; i++) {
for (int j = V; j >= 0; j--) {
for (int k = 0; k * b[i] <= a[i] && k * c[i] <= j; k++) {
f[j] = Math.max(f[j - k * c[i]] + k * d[i], f[j]);
}
}
}
return f[V];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int m = sc.nextInt();
//需要馅料
int[] a = new int[m + 1];
//消耗馅料
int[] b = new int[m + 1];
//面粉
int[] c = new int[m + 1];
//价格d
int[] d = new int[m + 1];
c[0] = sc.nextInt();
d[0] = sc.nextInt();
a[0] = 0;
b[0] = 0;
for (int i = 1; i <= m; i++) {
a[i] = sc.nextInt();
b[i] = sc.nextInt();
c[i] = sc.nextInt();
d[i] = sc.nextInt();
int res = maxValue(a, b, c, d, n);
System.out.println(res);
}
}
}
} 

腾讯成长空间 5958人发布