背包问题,一开始TLE,后来发现超INT啦,后来用unsigned long long 加上滚动数组优化就过了。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
typedef unsigned long long ULL;
const int MAXN = 2020;
const int INF = 0x3f3f3f3f;
ULL f[8010];
int n, C;
int V[] = {0, 50, 25, 10, 5, 1};
void init()
{
memset(f, 0, sizeof(f));
f[0] = 1;
n = 5;
}
int sum(int a, int b)
{
return a+b;
}
void dp()
{
for(int i = 1; i <= n; i++)
{
for(int v = V[i]; v <= C; v++)
{
f[v] = sum(f[v], f[v-V[i]]);
}
}
printf("%llu\n", f[C]);
}
void solve()
{
init();
dp();
}
int main()
{
while(~scanf("%d", &C))
{
solve();
}
return 0;
}
TLE:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int MAXN = 2020;
const int INF = 0x3f3f3f3f;
int f[MAXN][MAXN];
int n, C;
int V[] = {0, 50, 25, 10, 5, 1};
void init()
{
memset(f, 0, sizeof(f));
f[0][0] = 1;
n = 5;
}
void dp()
{
for(int i = 1; i <= n; i++)
{
for(int v = 0; v <= C; v++)
{
f[i][v] += f[i-1][v];
if(v >= V[i]) f[i][v] += f[i][v-V[i]];
}
}
printf("%d\n", f[n][C]);
}
void solve()
{
init();
dp();
}
int main()
{
while(~scanf("%d", &C))
{
solve();
}
return 0;
}