以下两个都是正确答案,之前错误是因为不能import自己的包。方法一时间复杂度为θ(VN),有问题,不能包括所有情况;方法二时间复杂度为θ()
方法1:
import java.util.*;
class Item
{
int price;
int weight;
int affiliation;
public Item(int price,int weight,int affiliation) {
this.price=price;
this.weight=weight;
this.affiliation=affiliation;
}
}
public class Main
{
public static void main(String[] arg)
{
ArrayList<Item> items;
Scanner scan=new Scanner(System.in);
int all_cash=scan.nextInt()/10;
int item_num=scan.nextInt();
items=new ArrayList<Item>(item_num);
int i,j,multi,multi_father,idx;
Item father,itm;
boolean[][] visit=new boolean[all_cash+1][item_num];
int[] box=new int[all_cash+1];
for(i=0;i<item_num;i++)
{
items.add(new Item(scan.nextInt()/10, scan.nextInt(), scan.nextInt()));
}
for(i=0;i<item_num;i++)
{
itm=items.get(i);
multi=itm.price*itm.weight;
if(itm.affiliation>0)
{
father=items.get(itm.affiliation-1);
multi_father=father.price*father.weight;
for(j=all_cash;j>=itm.price;j--)
{
idx=j-itm.price;
if(!visit[idx][itm.affiliation-1])
{
idx-=father.price;
if(idx>=0&&box[j]<box[idx]+multi+multi_father)
{
box[j]=box[idx]+multi+multi_father;
visit[j]=Arrays.copyOf(visit[idx], item_num);
visit[j][i]=true;
visit[j][itm.affiliation-1]=true;
}
}
else if(box[j]<box[idx]+multi){
box[j]=box[idx]+multi;
visit[j]=Arrays.copyOf(visit[idx], item_num);
visit[j][i]=true;
}
}
}
else {
for(j=all_cash;j>=itm.price;j--)
{
idx=j-itm.price;
if(box[j]<box[idx]+multi)
{
box[j]=box[idx]+multi;
visit[j]=Arrays.copyOf(visit[idx], item_num);
visit[j][i]=true;
}
}
}
}
System.out.println(box[all_cash]*10);
}
}
方法2:
import java.util.*;
class Item
{
int price;
int value;
public Item()
{
}
public Item(int price,int weight) {
this.price=price;
this.value=price*weight;
}
}
class MainItem extends Item
{
ArrayList<Item> list;
public MainItem(int price,int weight) {
super(price,weight);
list=new ArrayList<Item>(2);
}
}
public class Main
{
public static void main(String[] arg)
{
Scanner scan=new Scanner(System.in);
int all_cash=scan.nextInt()/10;
int item_num=scan.nextInt();
ArrayList<MainItem> main_items=new ArrayList<MainItem>(item_num);
Item main_itm,itm;
int[] box=new int[all_cash+1];
int[] item_idx=new int[item_num];
int i,j,idx,value,price,weight,affiliation;
for(i=0;i<item_num;i++)
{
price=scan.nextInt()/10;
weight=scan.nextInt();
affiliation=scan.nextInt();
if(affiliation==0)
{
item_idx[i]=main_items.size();
main_items.add(new MainItem(price, weight));
}
else {
main_items.get(item_idx[affiliation-1]).list.add(new Item(price, weight));
}
}
for(MainItem mitm:main_items)
{
for(j=all_cash;j>=mitm.price;j--)
{
switch(mitm.list.size())
{
case 2:
idx=j-mitm.price-mitm.list.get(1).price;
value=mitm.value+mitm.list.get(1).value;
if(idx>=0&&box[j]<box[idx]+value)
{
box[j]=box[idx]+value;
}
idx-=mitm.list.get(0).price;
value+=mitm.list.get(0).value;
if(idx>=0&&box[j]<box[idx]+value)
{
box[j]=box[idx]+value;
}
case 1:
idx=j-mitm.price-mitm.list.get(0).price;
value=mitm.value+mitm.list.get(0).value;
if(idx>=0&&box[j]<box[idx]+value)
{
box[j]=box[idx]+value;
}
case 0:
idx=j-mitm.price;
value=mitm.value;
if(box[j]<box[idx]+value)
{
box[j]=box[idx]+value;
}
default:
}
}
}
System.out.println(box[all_cash]*10);
}
}