1270: 【提高】简单背包问题
内存限制:64 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:9
解决:4
题目描述
有一个背包能装的重量maxw(正整数,0≤maxw≤20000),同时有n件物品(0≤n≤100),每件物品有一个重量wi(正整数)和一个价值pi(正整数)。要求从这n件物品中任取若干件装入背包内,使背包的物品价值最大。
输入
第1行:背包最大载重maxw,物品总数n
第2行到第n+1行:每个物品的重量和价值
第2行到第n+1行:每个物品的重量和价值
输出
一个数字即背包内物品最大价值
样例输入 复制
10 3
4 5
3 4
6 9
样例输出 复制
14
提示
#include<bits/stdc++.h> using namespace std; /* 动态转移方程: dp[i][j]=max(dp[i-1][j],v[i]+dp[i-1][j-w[i]]) */ //c:代表背包容量 //dp[i][j]:有i件物品,背包容量为j的情况下存储的最大价值 int c,dp[110][20100],w[110],v[110],i,j,n; int main(){ cin>>c>>n; for(i = 1;i <= n;i++) { cin>>w[i]>>v[i]; } //递推求db数组 //i: 代表物品数量 for(i = 1;i <= n;i++) { //在i件物品,讨论背包容量分别是1~c的情况下,最大价值 //j:代表背包容量 for(j = 1;j <=c ;j++) { //如果能放得下 if (w[i] <= j) { dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); } else{ //放不下 dp[i][j] = dp[i-1][j]; } } } //输出n件物品,背包容量为c的最大价值 cout<<dp[n][c]; return 0; }
#include<bits/stdc++.h> using namespace std; int dp[20010],n,w,i,j,wi,vi; int main(){ cin>>w>>n; for(i=1;i<=n;i++) { cin>>wi>>vi; for(int j=w;j>=wi;j--) { dp[j]=max(dp[j],dp[j-wi]+vi); } } cout<<dp[w]; return 0; }