01背包与完全背包的例题
01背包
例题洛谷P1048
代码:
#include<iostream>
using namespace std;
int T,M;
int W[105],V[105],dp[1005];
int main(){
cin>>T>>M;
for(int i=1;i<=M;i++){
cin>>W[i]>>V[i];
}
for(int i=1;i<=M;i++){
for(int j=T;j>=W[i];j--){
dp[j]=max(dp[j-W[i]]+V[i],dp[j]);
}
}
cout<<dp[T];
return 0;
}
完全背包
代码区别在于for的第二重循环条件反过来就好
例题洛谷P1616
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
int t,m,w,v;
long long dp[10000005];
int main(){
cin >> t >> m;
for(int i=1;i<=m;i++){
cin>>w>>v;
for(int j=w;j<=t;j++){
dp[j]=max(dp[j],dp[j-w]+v);
}
}
cout<<dp[t]<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
补充:动态规划可以做一些统计方案数的题目
例题洛谷P1164
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
int N,M;
int a[105];
int dp[10005]={1};
int main(){
cin>>N>>M;
for(int i=1;i<=N;i++){
cin>>a[i];
}
for(int i=1;i<=N;i++){
for(int j=M;j>=a[i];j--){
dp[j]=dp[j]+dp[j-a[i]];
}
}
cout<<dp[M]<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);

浙公网安备 33010602011771号