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行:每个物品的重量和价值

输出

一个数字即背包内物品最大价值

样例输入 复制

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