题目描述
有一个背包能装的重量 maxw (正整数,0 ≤maxw≤20000),同时有 n 件物品(1≤n≤100),每件物品有一个重量 wi (正整数)和一个价值 pi (正整数)。要求从这 nn 件物品中任取若干件装入背包内,使背包的物品价值最大。
输入
第 11 行:背包最大载重 maxw,物品总数 n ;
第 22 行到第 n+1 行:每个物品的重量和价值;
输出
一个数字即背包内物品最大价值;
样例
输入
复制
10 3 4 5 3 4 6 9
输出
复制
14
思路:
01背包问题
代码
#include<bits/stdc++.h>
using namespace std;
int n,i,m;
int s[101][20001];
int main(){
cin>>n>>m;
for(i=1;i<=m;i++){
int a,b;
cin>>a>>b;
for(int j=1;j<=n;j++){
if(j<a)s[i][j]=s[i-1][j];
else s[i][j]=max(s[i-1][j],s[i-1][j-a]+b);
}
}
cout<<s[m][n];
return 0;
}
//二维数组解法
优化
#include<bits/stdc++.h>
using namespace std;
int n,i,m;
int s[100001];
int main(){
cin>>n>>m;
for(i=1;i<=m;i++){
int a,b;
cin>>a>>b;
for(int j=n;j>=a;j--){
s[j]=max(s[j],s[j-a]+b);//一维数组优化
}
}
cout<<s[n];
return 0;
}
以上代码如有不足,请见谅!✌