题目描述:
安装应用奖励金币活动,不同的应用下载,试玩需要的流量大小不同,奖励的金币数量也不同,同一个应用多次下载只奖励一次金币,小华月末有一定的余量,计算下载哪些应用可以获取的金币最多?相同金币情况下,优先下载排名靠前的应用。
输入描述:
输入分三行
第一行:流量数,单位MB,整数
第二行:应用排名顺序,下载、试玩需要流量数,单位MB,整数
第三行:应用奖励的金币数
输出描述:
输出应用列表:建议下载的应用顺序号,用一个空格分隔
输入:
40
12 13 23 36
11 11 20 30
输出:
1 3
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
{
int total = Integer.valueOf(scanner.nextLine());
String inputapp = scanner.nextLine();
String inputcoin = scanner.nextLine();
String[] appst = inputapp.split(" ");
String[] coinst = inputcoin.split(" ");
int N = appst.length;
int[] app = new int[N + 1];
int[] coin = new int[N + 1];
for(int i = 1; i <= N; i++)
{
app[i] = Integer.valueOf(appst[i - 1]);
coin[i] = Integer.valueOf((coinst[i - 1]));
}
int[][] temp = new int[N + 1][total + 1]; //行:应用个数;列:流量数
ArrayList<Integer>[][] arrayLists = new ArrayList[N + 1][total + 1];
for(int i = 0; i <= N; i++)
{
for(int j = 0; j <= total; j++)
{
arrayLists[i][j] = new ArrayList<>();
}
}
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= total; j++)
{
if(app[i] <= j)
{
if(temp[i - 1][j] >= temp[i - 1][j - app[i]] + coin[i])
{ //不装
temp[i][j] = temp[i - 1][j];
arrayLists[i][j] = arrayLists[i - 1][j];
}
else
{ //装
temp[i][j] = temp[i - 1][j - app[i]] + coin[i];
arrayLists[i][j] = new ArrayList<>(arrayLists[i - 1][j - app[i]]);
arrayLists[i][j].add(i);
}
}
else
{
temp[i][j] = temp[i - 1][j];
arrayLists[i][j] = arrayLists[i-1][j];
}
}
}
ArrayList<Integer> list = arrayLists[N][total];
String res = "";
for(int t: list)
{
res += t + " ";
}
res=res.substring(0, res.length() - 1);
System.out.println(res);
}
}
}