题目意思:
有N个物品,分别有不同的重量Wi和价值Di,Bessie只能带走重量不超过M的物品,要是总价值最大,并输出总价值。
本题要点:
1、裸的 01背包题目。
参考代码 :《算法竞赛进阶指南》 276页。
开一维数组 dp
2、状态表示:
dp[j] 表示 背包中放入总体积为j的物品的最大价值。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MaxN = 3500, MaxM = 13000;
int v[MaxN], w[MaxN];
int dp[MaxM];
int n, m;void solve()
{
memset(dp, 0xcf, sizeof dp);dp[0] = 0;for(int i = 1; i <= n; ++i){
for(int j = m; j >= v[i]; --j){
dp[j] = max(dp[j], dp[j - v[i]] + w[i]);}}int ans = 0;for(int j = 0; j <= m; ++j){
ans = max(ans, dp[j]);}printf("%d\n", ans);
}int main()
{
scanf("%d%d", &n, &m);for(int i =1; i <= n; ++i){
scanf("%d%d", &v[i], &w[i]);}solve();return 0;
}/* 4 6 1 4 2 6 3 12 2 7 *//* 23 */