九度oj 1395:爱钱的胡老板

http://ac.jobdu.com/problem.php?id=1395 完全背包

View Code
 1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 using namespace std;
5 int item[60];
6 int dp[500008];
7 int main()
8 {
9 int n;
10 while(scanf("%d",&n)==1)
11 {
12 int i,j,sum=0;
13 for(i=1;i<=n;i++) scanf("%d",&item[i]),sum+=item[i];//要得到n种面额 ,至少需要sum
14 memset(dp,0,sizeof(dp));
15 for(i=1;i*item[1]<=sum;i++) dp[i*item[1]]=1;//
16 for(i=2;i<=n;i++)//完全背包,
17 {
18 for(j=item[i];j<=sum;j++) dp[j]+=dp[j-item[i]];//从item[i]--->sum
19
20 if(dp[sum]>1) break;//有这些种类的面额,能组成sum值的方法有多个,
21 }
22 if(dp[sum]==1) printf("%d\n",sum);
23 else printf("-1\n");
24 }
25 return 0;
26 }


 

posted @ 2012-04-01 10:33  keepmoving89  阅读(279)  评论(0编辑  收藏  举报