背包问题OJ地址:http://oj.noi.cn/oj/#main/show/1159
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