您的位置:首页 > 其它

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

2016-09-26 13:42 363 查看
题目地址: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: