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);
posted @ 2020-09-14 20:24  一个经常掉线的人  阅读(135)  评论(0)    收藏  举报