Coins(HDU 2844):一个会超时的多重背包

Coins  HDU 2844

不能用最基础的多重背包模板:会超时的!!!

之后看了二进制优化了的多重背包。

就是把多重转变成01背包:

具体思路见:http://www.cnblogs.com/tt123/p/3280521.html

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<stdio.h>
 4 #include<string.h>
 5 using namespace std;
 6 int dp[100005],a1[100005],a[105],b[105];
 7 int main()
 8 {
 9     int n,m,i,j,k,s,cout1;
10     while(scanf("%d%d",&n,&m)!=EOF)
11     {
12         if(n==0&&m==0)
13             break;
14         for(i=0;i<n;i++)
15             scanf("%d",&a[i]);
16         for(i=0;i<n;i++)
17             scanf("%d",&b[i]);
18         cout1=0;
19         for(i=0;i<n;i++)
20         {
21             for(k=1;k<=b[i];k<<=1)
22             {
23                 a1[cout1++]=k*a[i];
24                 b[i]-=k;
25             }
26             if(b[i]>0)
27                 a1[cout1++]=b[i]*a[i];
28         }
29         memset(dp,0,sizeof(dp));
30         for(i=0;i<cout1;i++)
31             for(j=m;j>=a1[i];j--)
32             dp[j]=max(dp[j],dp[j-a1[i]]+a1[i]);
33         s=0;
34         for(i=1;i<=m;i++)
35             if(dp[i]==i)
36             s++;
37         printf("%d\n",s);
38     }
39     return 0;
40 }

 

 

 

 

posted on 2013-08-29 23:44  ~~碾压机  阅读(238)  评论(0编辑  收藏  举报