POJ 1276 (多重背包) Cash Machine

时间:2022-02-19 08:08:40

题意:

有n种纸币,已知每种纸币的面值和数量,求所能凑成的不超过cash的最大总面值。

分析:

这道题自己写了一下TLE了,好可耻。。

找了份比较简洁的代码抄过来了。。poj1276

 #include <cstdio>
#include <cstring> const int maxn = ;
const int maxp = + ; bool vis[maxp];//是否到达总面值i
int used[maxp];//到达总面值i时,该种纸币所用的数量
int a[maxn], b[maxn];//每种纸币的数量以及面值 int cash, n; int main()
{
//freopen("in.txt", "r", stdin); while(scanf("%d", &cash) == )
{
scanf("%d", &n);
for(int i = ; i < n; ++i) scanf("%d%d", &a[i], &b[i]); memset(vis, false, sizeof(vis));
vis[] = true;
for(int i = ; i < n; ++i)
{
memset(used, , sizeof(used));
for(int j = b[i]; j <= cash; ++j)
if(vis[j-b[i]] && !vis[j] && used[j-b[i]] < a[i])
{ vis[j] = true; used[j] = used[j-b[i]] + ; }
} for(int i = cash; i >= ; --i) if(vis[i]) { printf("%d\n", i); break; }
} return ;
}

代码君