当前位置: 代码迷 >> 综合 >> HDU 2844 Coins 多重背包+常数优化 -
  详细解决方案

HDU 2844 Coins 多重背包+常数优化 -

热度:63   发布时间:2023-09-23 06:45:18.0

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2844

常数优化 ,不然TLE

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int val[100+5];
bool d[100000+5];
int main()
{int n,m,num;while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0) break;for(int i=0;i<n;i++)scanf("%d",&val[i]);memset(d,false,sizeof(d));d[0]=true; int cnt=0;for(int i=0;i<n;i++){scanf("%d",&num);int c=num,k=1;if(num*val[i]>m) {  //加上这个可以快一半 for(int j=val[i];j<=m;j++)if(d[j-val[i]]&&d[j]==false) d[j]=true,cnt++;continue;}while(c>k){for(int j=m;j>=k*val[i];j--)if(d[j-k*val[i]]&&d[j]==false) d[j]=true,cnt++;c-=k; k<<=1;}for(int j=m;j>=c*val[i];j--)if(d[j-c*val[i]]&&d[j]==false) d[j]=true,cnt++;}cout<<cnt<<endl;}return 0;
}