您的位置:首页 > 其它

NOI库8756 砝码称重V2

2015-10-14 17:24 190 查看
题目:http://noi.openjudge.cn/ch0207/8756/

分析:DP,如果分解成01背包会TLE。需要用部分背包做。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=105,Tmax2=100005;
int a[Tmax],w[Tmax]={0,1,2,3,5,10,20},ans;
bool f[Tmax2];
void zeropack(int wx)
{
int i;
for(i=Tmax2-2;i>=wx;i--)
f[i]=f[i]||f[i-wx];
return;
}
void mulpack(int wx,int num)
{
int k=1;
while(k<num)
{
zeropack(k*wx);
num-=k;
k<<=1;
}
zeropack(num*wx);
return;
}
int main()
{
int i;
scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]);
f[0]=true;
for(i=1;i<=6;i++)
mulpack(w[i],a[i]);
for(i=1;i<=Tmax2-2;i++)
ans+=f[i];
printf("Total=%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: