和為K的組合(01揹包)
阿新 • • 發佈:2018-11-08
給出N個正整陣列成的陣列A,求能否從中選出若干個,使他們的和為K。如果可以,輸出:“Yes”,否則輸出"No"。
Input
第1行:2個數N, K, N為陣列的長度, K為需要判斷的和(2 <= N <= 20,1 <= K <= 10^9)
第2 - N + 1行:每行1個數,對應陣列的元素Aii (1 <= Aii <= 10^6)
Output
如果可以,輸出:“Yes”,否則輸出"No"。
Sample Input
5 13
2
4
6
8
10
Sample Output
No
以前也做過這種和為k的題目,以前記得用二分做的。然後這次也嘗試用二分做,但是這一次不是確定的幾個數字相加。這樣二分就做不了了。然後想了想,這不就是一個簡單的01揹包嘛。k為揹包容量,給出的數字是體積。就是看看最後可不可以吧揹包填滿就好了啊。模板題。
程式碼如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define ll long long #define inf 0x3f3f3f3f using namespace std; const int maxx=1e7+10; ll a[100]; ll dp[maxx]; ll n,k; int main() { while(scanf("%lld%lld",&n,&k)!=EOF) { for(int i=0;i<n;i++) { scanf("%lld",&a[i]); } memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { for(int j=k;j>=a[i];j--) { dp[j]=max(dp[j],dp[j-a[i]]+a[i]); } } if(dp[k]==k) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
努力加油a啊,(o)/~