背包
01背包
#include<stdio.h>
#include<string.h>
int p[1123], m[1123], dp[11223];
int main()
{
int n, x, i, j;
while(~scanf("%d %d", &n, &x))
{
for(i = 1; i <= n; i++)
scanf("%d %d", &p[i], &m[i]);
memset(dp,0,sizeof(dp));
for(i = 1; i <= n; i++)
{
for(j = x; p[i] <= j; j--)
{
if(dp[j] < dp[j - p[i]] + m[i])
dp[j] = dp[j - p[i]] + m[i];
}
}
printf("%d\n", dp[x]);
}
return 0;
}
//x为有的钱,p[]为每个物品所花费的钱数,m[]获得的价值,dp[i],花费i元时,获得的最大价值。
完全背包
#include<stdio.h>
#include<string.h>
int dp[15000];
int p[10];
int MAX(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int t, x, i, j;
p[1] = 150;
p[2] = 200;
p[3] = 350;
scanf("%d", &t);
while(t--)
{
scanf("%d", &x);
memset(dp, 0, sizeof(dp));
for(i = 1; i <= 3; i++)
for(j = p[i]; j <= x; j++)
dp[j] = MAX(dp[j - p[i]] + p[i], dp[j]);
printf("%d\n", x - dp[x]);
}
return 0;
}
原理同上