一道比较简单的多重背包问题,网上还有人用二进制拆分做的
#include<stdio.h>
#include<string.h>
int a[100001], num[100001],dp[100001];
int value[11],piece[11];
int main()
{
int cash, n,i,j;
while (scanf("%d %d", &cash, &n) > 0)
{
for (i = 1; i <=n; i++)
{
scanf("%d %d", &piece[i], &value[i]);
}
memset(dp, 0, sizeof(dp));
for (i = 1; i <= n; i++)
{
memset(num, 0, sizeof(num));
for (j = value[i]; j <= cash; j++)
{
if (dp[j] < dp[j - value[i]]+value[i] && num[j - value[i]] < piece[i])//这个地方一定没有等号
{
dp[j] = dp[j - value[i]] + value[i];
num[j] = num[j - value[i]] + 1;
}
}
}
printf("%d\n", dp[cash]);
}
}