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;
}