您的位置:首页 > 其它

poj1742 coin 多重背包

2014-01-26 13:09 211 查看
#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

using namespace std;

#define maxn 105

#define maxm 100005

bool f[maxm];

int used[maxm], num[maxn], value[maxn];

int n, m;

void input()

{

for (int i =0; i < n; i++)

scanf("%d", &value[i]);

for (int i =0; i < n; i++)

scanf("%d", &num[i]);

}

void work()

{

memset(f, 0, sizeof(f));

f[0] =true;

int sum =0;

for (int i =0; i < n; i++)

{

memset(used, 0, sizeof(used)); //标记每一个价值使用的次数;

for (int j = value[i]; j <= m; j++)

{

if (!f[j] && f[j - value[i]] && used[j - value[i]] < num[i])//价值尽可能地大;

{

f[j] =true;

used[j] = used[j - value[i]] +1; //使用次数;

sum++;

}

}

}

printf("%d\n", sum);

}

int main()

{

//freopen("t.txt", "r", stdin);

while (scanf("%d%d", &n, &m), n | m)

{

input();

work();

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: