參考:https://www.cnblogs.com/A-S-KirigiriKyoko/p/6036368.html
0-1揹包
#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
int i,j,n,t,v;
cin>>t>>n;
int time[1000],value[1000];
int f[100][100]={0};
for(i=1;i<=n;i++){
cin>>time[i]>>value[i];
}
for(i=1;i<=n;i++){
for(j=0;j<time[i];j++){
f[i][j]=f[i-1][j];
// cout<<f[i][j]<<" ";
}
for(j=time[i];j<=t;j++){
f[i][j]=max(f[i-1][j],f[i-1][j-time[i]]+value[i]);
// cout<<f[i][j]<<" ";
}
// cout<<endl;
}
cout<<f[n][t];
return 0;
}
/*
70 3
71 100
69 1
1 2
*/
2.完全揹包
#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
int i,j,n,t,k;
cin>>t>>n;
int time[1000],value[1000];
int f[200][200]={0};
for(i=1;i<=n;i++){
cin>>time[i]>>value[i];
}
for(i=1;i<=n;i++){
for(j=0;j<=t;j++){
for(k=0;k<=j/time[i];k++){
f[i][j]=max(f[i][j],f[i-1][j-k*time[i]]+k*value[i]);
}
cout<<f[i][j]<<" ";
}
cout<<endl;
}
cout<<f[n][t];
return 0;
}
/*
70 3
71 100
69 1
1 2
*/
3.多重揹包
#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
int i,j,n,t,k;
cin>>t>>n;
int time[1000],value[1000],number[1000];
int f[200][200]={0};
for(i=1;i<=n;i++){
cin>>time[i]>>value[i]>>number[i];
}
for(i=1;i<=n;i++){
for(j=1;j<=t;j++){
for(k=1;k<=number[i];k++){
if ((j-k*time[i])<0) break;
f[i][j]=max(f[i-1][j],f[i-1][j-k*time[i]]+k*value[i]);
}
cout<<f[i][j]<<" ";
}
cout<<endl<<endl;
}
cout<<f[n][t];
return 0;
}
/*
140 3
71 100 20
69 1 20
1 2 20
*/