sandeep03edu

Coin Combinations II

Jul 31st, 2022 (edited)
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define MOD 1000000007;
  5.  
  6. #define got cout<<"YES\n"; return;
  7. #define got0 cout<<"YES\n"; return 0;
  8.  
  9. #define bhak cout<<"NO\n"; return;
  10. #define bhak0 cout<<"NO\n"; return 0;
  11.  
  12. #define bas cout<<"\n";
  13.  
  14.  
  15.  
  16. ll getAns(ll i, ll sum, ll n, vector<ll> &vec, vector<vector<ll>> &dp){
  17.     if(sum==0){
  18.         return 1;
  19.     }
  20.    
  21.     if(sum<0){
  22.         return 0;
  23.     }
  24.  
  25.     if(i==n){
  26.         return 0;
  27.     }
  28.  
  29.     if(dp[i][sum]!=-1){
  30.         return dp[i][sum];
  31.     }
  32.    
  33.     ll pick = getAns(i, sum-vec[i], n, vec, dp)%MOD;
  34.     ll notPick = getAns(i+1, sum, n, vec, dp)%MOD;
  35.    
  36.     return dp[i][sum] = (pick + notPick)%MOD;
  37. }
  38.  
  39. ll getAnsTab( ll sum, ll n, vector<ll> &vec){
  40.     vector<vector<ll>> dp(n+1, vector<ll> (sum+10, 0));
  41.    
  42.     for(int i=0; i<=n; ++i){
  43.         dp[i][0] = 1;
  44.     }
  45.    
  46.     for(int s=1; s<=sum; ++s){
  47.         dp[n][s] = 0;
  48.     }
  49.    
  50.     for(int i=n-1; i>=0; --i){
  51.         for(int j=0; j<=sum; ++j){
  52.             ll notPick = dp[i+1][j]%MOD;
  53.             ll pick = 0;
  54.            
  55.             if(j-vec[i]>=0){
  56.                 pick = dp[i][j-vec[i]];
  57.             }
  58.            
  59.             dp[i][j] = (pick + notPick)%MOD;
  60.         }
  61.     }
  62.    
  63.     return dp[0][sum];
  64. }
  65.  
  66.  
  67. ll getAnsOpt( ll sum, ll n, vector<ll> &vec){
  68.     // vector<vector<ll>> dp(n+1, vector<ll> (sum+10, 0));
  69.     vector<ll> next(sum+10, 0); // point at i==n at strat
  70.     vector<ll> curr(sum+10, 0); // Point from i==n-1
  71.    
  72.     // for(int i=0; i<=n; ++i){
  73.     //     dp[i][0] = 1;
  74.     // }
  75.     next[0]=1, curr[0]=1;
  76.    
  77.     for(int s=1; s<=sum; ++s){
  78.         // dp[n][s] = 0;
  79.         next[s] = 0;
  80.     }
  81.     ll pick, notPick;
  82.     for(int i=n-1; i>=0; --i){
  83.         for(int j=0; j<=sum; ++j){
  84.             // ll notPick = dp[i+1][j]%MOD;
  85.             notPick = next[j]%MOD;
  86.            
  87.             pick = 0;
  88.            
  89.             if(j-vec[i]>=0){
  90.                 // pick = dp[i][j-vec[i]];
  91.                 pick = (curr[j-vec[i]])%MOD;
  92.             }
  93.            
  94.             // dp[i][j] = (pick + notPick)%MOD;
  95.             curr[j] = (pick + notPick)%MOD;
  96.         }
  97.         swap(curr, next);
  98.     }
  99.    
  100.     // return dp[0][sum];
  101.     return next[sum];
  102. }
  103.  
  104.  
  105.  
  106. int main() {
  107.     // your code goes here
  108.     ll  n, sum; cin>>n>>sum;
  109.     vector<ll> vec(n);
  110.     for(ll i=0; i<n; ++i){
  111.         cin>>vec[i];
  112.     }
  113.  
  114.  
  115.     // vector<vector<ll>> dp(n+1, vector<ll> (sum+10, -1));
  116.    
  117.     ll ans = getAnsOpt(sum, n, vec);
  118.    
  119.     cout<<ans;
  120.     bas
  121.    
  122.     return 0;
  123. }
  124.  
Advertisement
Add Comment
Please, Sign In to add comment