Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://www.hackerrank.com/contests/dsa-11-2021-quy-hoach-dong/challenges/dp-bai-4-day-con-co-tong-bang-s/copy-from/1344680688
- #include <bits/stdc++.h>
- using namespace std;
- #define ms(s,n) memset(s,n,sizeof(s))
- #define all(a) a.begin(),a.end()
- #define present(t, x) (t.find(x) != t.end())
- #define sz(a) int((a).size())
- #define FOR(i, a, b) for (int i = (a); i < (b); ++i)
- #define FORd(i, a, b) for (int i = (a) - 1; i >= (b); --i)
- #define pb push_back
- #define pf push_front
- #define fi first
- #define se second
- #define mp make_pair
- #define endl "\n"
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- typedef pair<int,int> pi;
- typedef vector<int> vi;
- typedef vector<pi> vii;
- const int MOD = (int) 1e9+7;
- const int INF = (int) 1e9+2804;
- inline ll gcd(ll a,ll b){ll r;while(b){r=a%b;a=b;b=r;}return a;}
- inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
- int main(){
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- ll n,S ;
- cin >> n >> S ;
- vector < ll > a(n+2,0);
- bool f[n+2][S+2];
- FOR(i,1,n+1) cin >> a[i];
- for (int i=0;i<=n+1;i++){
- for (int j=0;j<=S+1;j++) f[i][j]= false ;
- }
- for (int i=0;i<=n+1;i++){
- f[i][0]=true ;
- }
- // dp
- for (int i=1;i<=n;i++){
- for (int j=1;j<=S;j++){
- f[i][j]=f[i-1][j];
- // can get a[i]
- if ( a[i]<=j ){
- if ( f[i-1][j-a[i]] ) f[i][j]=true ;
- }
- // f[i][j] là lấy trạng thái chọn tập có tổng bằng j
- // từ i-1 phần tử ban đầu nhưng bên dưới vẫn còn có
- // câu lệnh để thay đổi trạng thái tại f[i][j]
- // ví dụ f[i][j]= f[i-1][j] = false và câu lệnh dưới thoả mãn => f[i][j] != f[i-1][j]
- }
- }
- cout << f[n][S];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment