链接:https://ac.nowcoder.com/acm/contest/289/K
来源:牛客网
题目描述
因为现在的新生太强了,都学会了“dp”,所以就有了这样一个“dp”题,双11时Gugugu有(x,x+1,x+2…y-1,y)元的抵用券无数张,但是Gugugu有强迫症所以他希望他使用抵扣券正好能够抵扣k元,这样他就能安心的买下这件商品,但是他却不会计算所以希望你们告诉他能不能一种方法使抵用券正好抵扣k元。
输入描述:
第一行输入t代表有t组数据,第二行开始每行三个数k,x,y代表需要抵扣k元,x,y代表拥有抵用券的最小面值和最大面值。(1<=t<=200)(1<=k,x,y<109)(x<=y)
输出描述:
输出"Y"代表示能正好抵扣,输出"N"代表不能正好抵扣
示例1
输入
复制
2
7 2 4
6 4 5
输出
复制
Y
N
真是沙雕题,更沙雕的是,我还信了,我还按着完全背包去做了,真的是,1e9的数据量,就算是能开出数组来也超时啊,啊啊啊
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
ll k,x,y;
cin>>k>>x>>y;
ll z=k/x;
if(z*y>=k) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
}
完全背包代码如下:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
ll t,x,y,k;
int main()
{
cin>>t;
while(t--)
{
cin>>k>>x>>y;
int n=y-x+1;
int a[n+1];
int dp[k+1];
int cnt=0;
for(int i=x;i<=y;i++)
{
a[cnt++]=i;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<cnt;i++)
{
for(int j=a[i];j<=k;j++)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
if(dp[k]!=k) cout<<"N"<<endl;
else cout<<"Y"<<endl;
}
}
努力加油a啊,(o)/~