找數達人
- 描述
-
小明最近做出了一道題:如何在一組數中尋找三個數,這三個數的和等於一給出的定值m,洋洋得意。於是小華不樂意了,小華說,你能找找在一組數字中是否有n個數,使得這n個數的和等於一給定的定值m嗎?
1.0 < 數字大小 <= 1000
2. 0 < 序列中數字個數 <= 1000
3. 0 <= m <=1000
- 輸入
- 多組數據,每組兩行,第一行爲序列內容,第二行爲m的值。
- 輸出
- 如能找到,輸出Yes,否則,輸出No。
- 樣例輸入
-
1 3 4 5
-
5
-
1 3 4 5 9
-
2
- 樣例輸出
-
Yes
-
No
- 思路:一個簡單的01揹包問題,就是能否把容量爲m的揹包裝滿。
#include<stdio.h> #include<string.h> #define Max(a,b) a>b?a:b int dp[10000]; int num[10000]; int main() { int n,m; int count=0; char c; while(scanf("%d%c",&n,&c)!=EOF) { count=0; num[count++]=n; while(scanf("%d%c",&n,&c)) { num[count++]=n; if(c=='\n') break; } memset(dp,0,sizeof(dp)); scanf("%d",&m); for(int i=0;i<count;i++) { for(int j=m;j>=num[i];j--) { dp[j]=Max(dp[j],dp[j-num[i]]+num[i]); } } // for(int i=1;i<=m;i++) printf("%d ",dp[i]); // printf(" #\n"); if(dp[m]==m) printf("Yes\n"); else printf("No\n"); } }