填表思路
#include <iostream>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
#include<cstdlib>
#include<vector>
int max(int a, int b) {
return a > b ? a : b;
}
int main()
{
int capacity;
int itemNum;
cin >> capacity >> itemNum;
vector<vector<int>> itemList(itemNum, vector<int>(itemNum, 0));
vector<vector<int>> dp(itemNum+1, vector<int>(capacity+1, 0));
for (int i = 0; i < itemNum; i++) {
cin>>itemList[i][0]>>itemList[i][1];
}
for (int i = 1; i <= itemNum; i++) {
for (int j = 0; j <= capacity; j++) {
if (j >= itemList[i-1][0]) {
dp[i][j] = max( dp[i - 1][j - itemList[i-1][0]] + itemList[i - 1][1], dp[i - 1][j]);
}
else {
dp[i][j] = dp[i - 1][j];
}
}
}
cout<<dp[itemNum][capacity]<<endl;
return 0;
}
递归备忘录思路
#include <iostream>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
#include<cstdlib>
#include<vector>
int max(int a, int b) {
return a > b ? a : b;
}
int recursion(int curIndex,int curCapacity,int itemNum, vector<vector<int>> itemList, vector<vector<int>> memory) {
if (curIndex == itemNum) {
return 0;
}
if (memory[curIndex][curCapacity] != 0) {
return memory[curIndex][curCapacity];
}
if (curCapacity >= itemList[curIndex][0]) {
memory[curIndex][curCapacity] = max(recursion(curIndex + 1, curCapacity - itemList[curIndex][0], itemNum, itemList, memory) + itemList[curIndex][1],
recursion(curIndex + 1, curCapacity, itemNum, itemList, memory));
}
else {
memory[curIndex][curCapacity] = recursion(curIndex + 1, curCapacity, itemNum, itemList, memory);
}
return memory[curIndex][curCapacity];
}
int main()
{
int capacity;
int itemNum;
cin >> capacity >> itemNum;
vector<vector<int>> itemList(itemNum, vector<int>(itemNum, 0));
vector<vector<int>> memory(itemNum, vector<int>(capacity+1, 0));
for (int i = 0; i < itemNum; i++) {
cin>>itemList[i][0]>>itemList[i][1];
}
cout<< recursion(0, capacity,itemNum,itemList, memory)<<endl;
return 0;
}