题目描述
题目思路
这是一个情形相对简单的背包问题。暴力搜索可能超时,因此考虑动态规划。建立二维数组,表示前
个物品占用的总体积为
,数组的元素为布尔类型,为true即为能达到该状态,false则表示不能到达该状态。
设为第
个物品占用的体积,状态转移方程:
我的代码
#include <iostream>
#include <algorithm>
using namespace std;
bool dp[35][20005];
int v[35];
int main() {
int n;
int i;
int j;
int V;
cin >> V;
cin >> n;
for (i = 1; i <= n; i++)
{
cin >> v[i];
}
//赋初值
for (i = 0; i <= 20000; i++)
{
if (i == v[1] || i == 0) {
dp[1][i] = true;
}
else {
dp[1][i] = false;
}
}
//DP
for (i = 2; i <= n; i++) {
for (j = 0; j <= V; j++)
{
if (j - v[i] >= 0) {
dp[i][j] = (dp[i - 1][j - v[i]] || dp[i - 1][j]);
}
else {
dp[i][j] = dp[i - 1][j];
}
}
}
//获取答案
int ans;
for (i = 0; i <= V; i++) {
if (dp[n][i]) {
ans = V-i;
}
}
cout << ans;
return 0;
}