如何解决与运行结果混淆类似于背包问题
一个人有薪水,想购买一些产品:
primary additional
---------------------------------
computer printer,scanner
bookshelf books
desk lamp,stationary
armchair null
为了购买额外的产品,他必须购买其相应的“主要产品”,就像您要购买扫描仪一样,必须一起购买计算机。每个主要产品可以添加0个或1个或2个。
他为1〜5(int)中的每个产品设置了重要的等级,5是最重要的。另外,每个价格(价格是10的倍数)。
他希望价格等于或小于N(价格),最大价格和重要水平的乘积。
输入:
第一行是两个整数,中间是空格N和m, N 表示数量有限。 m 代表他要购买的许多产品。
从2到m + 1行,第j行给出其索引为j-1的乘积的基本信息,每行有三个数字v p q。 v 代表每种产品的价格 p 表示重要级别 q 表示是否附加。如果q = 0是主要产品,或者q是它所属的主要产品的索引。
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
输出: 给定所有产品的价格的最大数量(价格*重要级别)
2200
我的代码在下面,上面显示的示例运行良好,但是如果我将输入更改为:
1500 7
500 1 0
400 4 0
300 5 1
400 5 1
200 5 0
500 4 0
400 4 0
预期的答案是6200,但是我得到了6100,这是错误的
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int N = Integer.parseInt(str.split(" ")[0])/10;
int m = Integer.parseInt(str.split(" ")[1]);
int[] v= new int[m+1];
int[] p= new int[m+1];
int[] q= new int[m+1];
boolean[] flags = new boolean[m+1];
int[][] res = new int[m+1][N+1];
for (int i = 1; i <= m; i++) {
String[] strings = br.readLine().split(" ");
v[i] = (Integer.parseInt(strings[0]))/10;
p[i] = Integer.parseInt(strings[1]) * v[i];
q[i] = Integer.parseInt(strings[2]);
}
for (int i = 1; i <= m; i++) {
for(int j = 1; j<=N; j++){
if(q[i] == 0) {
if(v[i] <= j){
res[i][j] = Math.max(res[i-1][j],res[i-1][j-v[i]] + p[i]);
}
}else{
if(v[i] + v[q[i]] <= j){
res[i][j] = Math.max(res[i-1][j],res[i-1][j-v[i]] + p[i]);
}
}
}
}
System.out.println(res[m][N] * 10);
}
}
有人可以告诉我哪里出了问题吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。