1. 程式人生 > 實用技巧 >01揹包與完全揹包的例題

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);