Dollar Dayz
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5926 | Accepted: 2234 |
Description
Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. During his first visit, the tools are selling variously for $1, $2, and $3. Farmer John has exactly $5 to spend. He can buy 5 tools at $1 each or 1 tool at $3 and an additional 1 tool at $2. Of course, there are other combinations for a total of 5 different ways FJ can spend all his money on tools. Here they are:
1 @ US$3 + 1 @ US$2 1 @ US$3 + 2 @ US$1 1 @ US$2 + 3 @ US$1 2 @ US$2 + 1 @ US$1 5 @ US$1Write a program than will compute the number of ways FJ can spend N dollars (1 <= N <= 1000) at The Cow Store for tools on sale with a cost of $1..$K (1 <= K <= 100).
Input
A single line with two space-separated integers: N and K.
Output
A single line with a single integer that is the number of unique ways FJ can spend his money.
Sample Input
5 3
Sample Output
5
Source
这道题如果背包做多了就有感觉。如果设dp[i][j]是看到第i种工具时能组成价格j的方案数,那么就有
dp[i][j]=dp[i-1][j-i]+dp[i-1][j-2*i]……一直到减到>=0
但是问题是这个问题的解,long long存不下,那么就得分成两块,一块前面的一块后面的,那个mod要足够大,因为最后一组数据是30位的数,mod弄小了会前面的存不下,缺位。
我还使用了循环的dp数组,要注意及时清空,不费时的。
下面贴代码:
Run ID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
15596341 | xxxx | 3181 | Accepted | 196K | 79MS | C++ | 821B | 2016-06-07 17:07:29 |
#include
#include
#include
using namespace std;
long long n,k,mod;
int cur;
long long a[2][1010],b[2][1010];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("ddayz.10.in","r",stdin);
#endif
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%lld %lld",&n,&k);
a[0][0]=1;
cur=0;mod=100000000000000000;
for(int i=1;i<=k;i++)
{
cur=!cur;
for(int j=0;j<=n;j++)
{
long long sum1=0,sum2=0;
for(int m=0;m*i<=j;m++)
{
sum1+=a[!cur][j-m*i];
sum2+=b[!cur][j-m*i];
}
a[cur][j]=sum1;
b[cur][j]=sum2;
b[cur][j]+=a[cur][j]/mod;
a[cur][j]=a[cur][j]%mod;
}
memset(a[!cur],0,sizeof(a[!cur]));
memset(b[!cur],0,sizeof(b[!cur]));
}
;
if(b[cur][n]>0)
printf("%I64d%I64d",b[cur][n],a[cur][n]);
else printf("%I64d",a[cur][n]);
return 0;
}