Прошу помощи!!! В чем может быть проблема? Тесты проходит, но Валя не принимает первые 2 и последние 2 пункта.
public class AdvertisementManager {
private final AdvertisementStorage storage=AdvertisementStorage.getInstance();
private int timeSeconds;
List<Advertisement> listOFVideos=storage.list();
List<Advertisement> listOfVideosForDisplaying=new ArrayList<>();
private int[][] seen;
private int [][]keep;
private long [] values;
private int [] sizes;
public AdvertisementManager(int timeSeconds){
this.timeSeconds=timeSeconds;
this.seen=new int[timeSeconds+1][timeSeconds+1];
this.keep=new int[timeSeconds+1][timeSeconds+1];
this.values=new long[listOFVideos.size()];
this.sizes=new int[listOFVideos.size()];
}
public void processVideos() throws NoVideoAvailableException {
int i=0,j=0;
for (Advertisement element:listOFVideos){
values[i]=element.getAmountPerOneDisplaying();
if (i<2)
i++;
}
for(Advertisement element:listOFVideos){
sizes[j]=element.getDuration();
if (j<2)
j++;
}
if (storage.list().isEmpty())
throw new NoVideoAvailableException();
else{
knapsack(listOFVideos.size()-1,timeSeconds);
int numberOfItems=listOFVideos.size();
int capacity=timeSeconds;
while (numberOfItems>=0){
if (keep[numberOfItems][capacity]==1){
listOfVideosForDisplaying.add(listOFVideos.get(numberOfItems));
capacity-=sizes[numberOfItems];
numberOfItems--;
}
else
numberOfItems--;
}
Collections.sort(listOfVideosForDisplaying, new Comparator<Advertisement>() {
public int compare(Advertisement o1, Advertisement o2) {
return (int) (o2.getAmountPerOneDisplaying()-
o1.getAmountPerOneDisplaying());
}
});
for (Advertisement element:listOfVideosForDisplaying) {
//First Video is displaying... 50, 277
System.out.println(element.getName()+" is displaing... "+element.getAmountPerOneDisplaying()+", "+
element.getAmountPerOneDisplaying()*1000/element.getDuration());
element.revalidate();
}
}
}
private int knapsack(int index, int capacity){
int take=0;
int donttake=0;
if (index==0){
if (sizes[0]<=capacity){
keep[index][capacity]=1;
seen[index][capacity]=(int)values[0];
return (int)values[0];
}
else{
keep[index][capacity]=0;
seen[index][capacity]=0;
return 0;
}
}
if (sizes[index]<=capacity)
take=knapsack(index-1,capacity-sizes[index])+(int)values[index];
donttake=knapsack(index-1,capacity);
seen[index][capacity]=Math.max(take,donttake);
if (take>donttake)
keep[index][capacity]=1;
else
keep[index][capacity]=0;
return seen[index][capacity];
}
}