B. I Hate 1111
题意
题意:给我们一个数问我们能不能用11,111,1111,11111…这些数凑出来。
思路
思路:有一个小结论就是两个互质的数,我们最大凑不出来的数是a*b-a-b所以最大凑不出来的数是1099,比1099大的数我们都可以通过11和111凑出来。
那现在我们可以看一下小于这个数的数字能否被凑出来呢。
我们考虑完全背包,我们可以把数看做背包的体积,我们要求的就是用体积为11,111,1111…等等这些体积的物品,能否填满体积为n的背包。
那我们就可以设f[i]为体积正好为i时的方案数是多少。我们我们就可以推出下面的转移方程 f [ i ] + = f [ i − v ] f[i] += f[i-v] f[i]+=f[i−v]。
#include <bits/stdc++.h>
using namespace std;
const int N = 2010;
int f[N];
int d[5] = {0,11,111,1111,11111};
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(x>1200)
{
cout<<"YES"<<endl;
continue;
}
else
{
f[0]=1;
for(int i=1;i<=4;i++)
{
for(int j=d[i];j<=x;j++)
{
f[j] += f[j-d[i]];
}
}
//cout<<f[x]<<endl;
if(!f[x])
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
}
}
int main()
{
int T=1;
while(T--)
{
solve();
}
return 0;
}
总结:思路要打开一点,一开始没想到是背包的问题,然后多积累一些小结论,比如这个题的结论两个互质的数你n,m最大不能表示的数是n*,m-n-m