3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
8 4
比模板多了的唯一一点是查多少数字出现过==很容易想到枚举一遍dp[i]==i的个数
1A呦 真是幸运的一个晚上,会不会好运从此开始了呢戒骄戒躁 一切都会好起来的==
/********* hud2844 2015.11.2 390MS 1956K 1298 B *********/ #include <iostream> #include<cstdio> #include<cstring> using namespace std; int dp[100007],n,m,a[105],c[105],count; void zeropack(int cost,int value) { for(int i=m;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+value); // cout<<"01"<<endl; } void completepack(int cost,int value) { for(int i=cost;i<=m;i++) dp[i]=max(dp[i],dp[i-cost]+value); //cout<<"complete"<<endl; } void multipack(int cost,int value,int num) { if(num*cost>=m) { completepack(cost,value); return; } int k=1; while(k<num) { zeropack(k*cost,k*value); num-=k; k*=2; } zeropack(num*cost,num*value); } int main() { // freopen("cin.txt","r",stdin); while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&c[i]); memset(dp,0,sizeof(dp)); count=0; for(int i=1;i<=n;i++) { multipack(a[i],a[i],c[i]); } for(int i=1;i<=m;i++) { if(dp[i]==i) count++; //printf("dp[]=%d\n",dp[i]); } printf("%d\n",count); } return 0; }