http://ac.jobdu.com/problem.php?pid=1025
200.00 3 2 A:23.50 B:100.00 1 C:650.00 3 A:59.99 A:120.00 X:10.00 1200.00 2 2 B:600.00 A:400.00 1 C:200.50 1200.50 3 2 B:600.00 A:400.00 1 C:200.50 1 A:100.00 100.00 0
123.50 1000.00 1200.50
#include <stdio.h> double data[30]; int len; double ans,q; void dfs(int k,double sum) { if(k==len) { if(sum>ans) ans=sum; return; } dfs(k+1,sum); if(sum+data[k]<=q) dfs(k+1,sum+data[k]); } int main() { int n,m; char cc; while(scanf("%lf %d",&q,&n)&&n!=0) { len=0;ans=-1; for(int i=0;i<n;i++) { scanf("%d",&m); double a=0,b=0,c=0,temp,sum=0; int flag=1; while(m--) { scanf(" %c:%lf",&cc,&temp); if(cc=='A') a+=temp; else if(cc=='B') b+=temp; else if(cc=='C') c+=temp; else flag=0; sum+=temp; } if(flag&&sum<=1000&&a<=600&&b<=600&&c<=600) data[len++]=sum; } dfs(0,0); printf("%.2f\n",ans); } } /************************************************************** Problem: 1025 User: 从此醉 Language: C Result: Accepted Time:10 ms Memory:908 kb ****************************************************************/
用DFS可以过是因为测试数据太水了。
在HOJ上也有这个题,用DFS超时,看来还得用动态规划。http://acm.hdu.edu.cn/showproblem.php?pid=1864
#include <stdio.h> int data[31]; int len,maxa; double ans,q; int opt[3000000]; int main() { int n,m; char cc; while(scanf("%lf %d",&q,&n)&&n!=0) { maxa = q * 100; len=0;ans=-1; for(int i=0;i<n;i++) { scanf("%d",&m); double a=0,b=0,c=0,temp,sum=0; int flag=1; while(m--) { scanf(" %c:%lf",&cc,&temp); if(cc=='A') a+=temp; else if(cc=='B') b+=temp; else if(cc=='C') c+=temp; else flag=0; sum+=temp; } if(flag&&sum<=1000&&a<=600&&b<=600&&c<=600) data[len++]= sum * 100; } for(int i=0; i<=maxa; i++) opt[i] = 0; for(int i=0; i<len; i++){ for(int j=maxa; j>=data[i]; j--){ if(opt[j-data[i]] + data[i] > opt[j]) opt[j] = opt[j-data[i]] + data[i]; } } ans = opt[maxa] / 100.0; printf("%.2f\n",ans); } }