这两道题也是动态规划,思想不变,在计算最优解的值的时候稍作修改即可。
1.
有一个箱子容量为 V,同时有 n个物品,每个物品有一个体积。
现在从 n 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。
输入格式
第一行共一个整数 V,表示箱子容量。
第二行共一个整数 n,表示物品总数。
接下来 n 行,每行有一个正整数,表示第 i 个物品的体积。
输出格式
共一行一个整数,表示箱子最小剩余空间。
代码如下:
#include <stdio.h>
int c[30];
int dp[30][20000];
int min(int a, int b)
{
if (a > b)
{
return b;
}
else
{
return a;
}
}
int main()
{
int v, n;
scanf("%d%d", &v, &n);
for (int m = 0; m < n; m++)
{
scanf("%d", &c[m]);
}
for (int j = 0; j <= v; j++)
{
for (int i = 0; i < n; i++)
{
if (c[i] > j)
{
if (i == 0)
{
dp[i][j] = j;
}
else
{
dp[i][j] = dp[i - 1][j];
}
}
else
{
if (i == 0)
{
dp[i][j] = j - c[i];
}
else
{
dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - c[i]]);
}
}
}
}
printf("%d", dp[n - 1][v]);
}
2.
代码如下:
#include <stdio.h>
int price[25], im[25];
int dp[25][30000];//dp[前i个最优解][剩余钱数]
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);//n:钱 m:个数
for (int i = 0; i < m; i++)
{
scanf("%d%d", &price[i], &im[i]);
}
for (int j = 1; j <= n; j++)
{
for (int i = 0; i < m; i++)
{
if (price[i] > j)
{
if (i == 0)
{
dp[i][j] = 0;
}
else
{
dp[i][j] = dp[i - 1][j];
}
}
else
{
if (i == 0)
{
dp[i][j] = im[i] * price[i];
}
else
{
dp[i][j] = max(im[i] * price[i] + dp[i - 1][j - price[i]], dp[i - 1][j]);
}
}
}
}
printf("%d", dp[m - 1][n]);
}
如有错误请多多指正!