首页 > 代码库 > Snapchat - give sum target list<Integer> first who hits target wins

Snapchat - give sum target list<Integer> first who hits target wins

// DP 从 1-N 不重复取数 加到sum 上 第一个超过target赢 先手可以赢吗?

开始想错了,以为和climbing stairs和combination sum iv一个类型,是一个dfs

 1 dfs(list, sum, target) 2  3   1. 如果list长度是0,那么就说明当前玩家没机会赢了,返回false 4  5   2.  如果list长度是1,那么说明该玩家赢了,因为后面一个玩家已经没机会抽了 6  7   3. 对于list中的数依次尝试: 8  9     如果当前数字加上sum能够达到target了,就返回true10     否则,从list中把这个数移除,递归11 12     如果递归的结果是true,也就是说下一个玩家会赢,也就是说当前玩家会输,那么result是false13     再把这个数加回去,记得放回原位!       

 

代码:

 1 public class ChooseOneNumFirstWIllWin { 2     public boolean dfs(List<Integer> list, int sum, int target) { 3         if(list.size() == 0) { 4             return false; 5         } 6         if(list.size() == 1) { 7             return true; 8         } 9         boolean result = true;10         for(int i = 0; i < list.size(); i++) {11             if(sum + list.get(i) >= target) {12                 return true;13             }14             int cur = list.remove(i);15             if(dfs(list, sum + cur, target)) {16                 result = false;17             }18             list.add(i, cur);19         }20         return result;21     }22     23     public static void main(String[] args) {24         List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));25         int sum = 0;26         int target = 11;27         ChooseOneNumFirstWIllWin sample = new ChooseOneNumFirstWIllWin();28         System.out.println(sample.dfs(list, sum, target));29         30     }31 }

 

   

 

Snapchat - give sum target list<Integer> first who hits target wins