【动态规划】基础背包问题
1159. 背包问题一 (Standard IO)
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
有个背包可承受重量N,现有T件物品
每件物品重量为Wi,价值为Vi ,每件物品只有一个,这个背包可以装载物品的最大价值是多少?
输入
一行,N T 之间用空格隔开。
后面t行,每行:重量Wi,价值Vi。
输出
这个背包可以装载物品的最大价值。
样例输入
100 5
77 92
22 22
29 87
50 46
99 90
样例输出
133
数据范围限制
N<=1000,T<=100,1<=Wi,Vi<=100
/*
问题:
有个背包可承受重量N,现有T件物品.
每件物品重量为Wi,价值为Vi.
每件物品只有一个.
这个背包可以装载物品的最大价值是多少?
*/
#include <iostream>
#include <cstdio>
using namespace std;
//定义三个数组, W为不同物体的 重量,V为不同物体的价值,F为不同称量背包的总价值;
int W[2005],V[2005],F[2005];
int main()
{
/*-------定义变量并读入数据------------*/
int N,T;
scanf("%d %d",&N,&T);
for(int i=1;i<=T;i++)
scanf("%d %d",&W[i],&V[i]);
/*--------------动态规划----------------*/
for(int i=1;i<=T;i++)//遍历每一件物品
for(int j=N;j>=W[i];j--)//不断地尝试 放置每一件物品
{
F[j]=max(F[j-W[i]]+V[i],F[j]);//状态转移方程: F[j]=max(F[j-W[i]]+V[i],F[j]) 刷新最大背包的当前最大价值;
/*详细分析此处:
这里使用了动态规划算法,其实也就是记忆化搜索,
就是把F【】中没搜一次都记录在F这个数组中,
以后再次递归或递推时,就不需要 再次的计算,
直接从数组中查询是否存在,如果存在,直接调用即可;
*/
}
/*----------------输出解答-------------*/
cout<<F[N]<<endl;
return 0;
} //PS:2017年10月2日19:02:02