01背包用一维dp的话,内存循环是从最大容量遍历到当前物品体积:
for(int j = 最大容量;j>=weight[i];j--)
完全背包一维dp是相反的,从当前物品体积遍历到最大容量:
for(int j = weight[i];j<=bag_weight;j++)
#include<bits/stdc++.h>
using namespace std;
int f[2000][2000]={0};//此处f函数第一行和第一列全为0;
int v[2000]={0};
int w[2000]={0};
int main(){
int m,n;
while(cin>>m>>n){
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(w[i]>j){
f[i][j]=f[i-1][j];
}else{
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
}
}
}
cout<<f[n][m]<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int dp[1200]={0};
int t[1200]={0};
int w[1000]={0};//一维dp可以解决一个物品多次购买的问题
int main(){
int n,v;
cin>>n>>v;
for(int i=1;i<=n;i++){
cin>>t[i]>>w[i];
}
for(int i=1;i<=n;i++){
for(int j=t[i];j<=v;j++){
dp[j]=max(dp[j],dp[j-t[i]]+w[i]);
}
}
cout<<dp[v];
return 0;
}