publicintcountPartitions(int[] nums, int k) { varsum=0L; for (var x : nums) sum += x; if (sum < k * 2) return0; varans=1; varf=newint[k]; f[0] = 1; for (var x : nums) { ans = ans * 2 % MOD; for (varj= k - 1; j >= x; --j) f[j] = (f[j] + f[j - x]) % MOD; } for (var x : f) ans = (ans - x * 2 % MOD + MOD) % MOD; // 保证答案非负 return ans; } }
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { constint MOD = 1e9 + 7; public: intcountPartitions(vector<int> &nums, int k){ if (accumulate(nums.begin(), nums.end(), 0L) < k * 2) return0; int ans = 1, f[k]; memset(f, 0, sizeof(f)); f[0] = 1; for (int x : nums) { ans = ans * 2 % MOD; for (int j = k - 1; j >= x; --j) f[j] = (f[j] + f[j - x]) % MOD; } for (int x : f) ans = (ans - x * 2 % MOD + MOD) % MOD; // 保证答案非负 return ans; } };
funccountPartitions(nums []int, k int)int { const mod int = 1e9 + 7 sum := 0 for _, x := range nums { sum += x } if sum < k*2 { return0 } ans := 1 f := make([]int, k) f[0] = 1 for _, x := range nums { ans = ans * 2 % mod for j := k - 1; j >= x; j-- { f[j] = (f[j] + f[j-x]) % mod } } for _, x := range f { ans -= x * 2 } return (ans%mod + mod) % mod // 保证答案非负 }