动态规划 —— 背包问题 —— 背包问题模版
生活随笔
收集整理的這篇文章主要介紹了
动态规划 —— 背包问题 —— 背包问题模版
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【0-1背包】
#include<iostream> #define MAX 101 using namespace std; int V,N; int w[MAX],c[MAX],f[MAX]; void ZeroOnePack(int cost,int weight) {for(int v=V;v>=weight;v--)f[v]=max(f[v],f[v-weight]+cost); }int main() {cin>>V>>N;for(int i=1;i<=N;i++)cin>>w[i]>>c[i];for(int i=1;i<=N;i++)ZeroOnePack(c[i],w[i]);cout<<f[V]<<endl;return 0; }【完全背包】
#include<iostream> #define MAX 101 using namespace std; int V,N; int w[MAX],c[MAX],f[MAX]; void CompletePack(int cost,int weight) {for(int v=weight;v<=V;v++)f[v]=max(f[v],f[v-weight]+cost); }int main() {cin>>V>>N;for(int i=1;i<=N;i++)cin>>w[i]>>c[i];for(int i=1;i<=N;i++)CompletePack(c[i],w[i]);cout<<f[V]<<endl;return 0; }【多重背包】
#include<iostream> #define MAX 101 using namespace std; int V,N; int w[MAX],c[MAX],num[MAX],f[MAX]; void MultiplePack(int cost,int weight,int num) {for(int j=V;j>=0;j--)for(int k=0;k<=num;k++)if(j-k*weight>=0)f[j]=max(f[j],f[j-k*weight]+k*cost); } int main() {cin>>N>>V;for(int i=1;i<=N;i++)cin>>w[i]>>c[i]>>num[i];for(int i=1;i<=N;i++)MultiplePack(c[i],w[i],num[i]);cout<<f[V]<<endl;return 0; }【混合背包】
#include<iostream> #define MAX 101 using namespace std; int V,N; int w[MAX],c[MAX],num[MAX],f[MAX]; void ZeroOnePack(int cost,int weight) {for(int v=V;v>=weight;v--)f[v]=max(f[v],f[v-weight]+cost); } void CompletePack(int cost,int weight) {for(int v=weight;v<=V;v++)f[v]=max(f[v],f[v-weight]+cost); } void MultiplePack(int cost,int weight,int num) {for(int j=V;j>=0;j--)for(int k=0;k<=num;k++)if(j-k*weight>=0)f[j]=max(f[j],f[j-k*weight]+k*cost); } int main() {cin>>V>>N;for(int i=1;i<=N;i++)//num[i]是物品個(gè)數(shù),為0時(shí)代表可取無限次cin>>w[i]>>c[i]>>num[i];for(int i=1;i<=N;i++){if(num[i]==1)//0-1背包ZeroOnePack(c[i],w[i]);else if(num[i]==0)//完全背包CompletePack(c[i],w[i]);else//多重背包MultiplePack(c[i],w[i],num[i]);}cout<<f[V]<<endl;return 0; }【二維背包】
#include<iostream> #define MAX 101 using namespace std; int V,U,N; int v[MAX],u[MAX],c[MAX],f[MAX][MAX]; void TwoDimensionPack(int weight_1,int weight_2,int cost) {for(int j=V;j>=weight_1;j--) for(int k=U;k>=weight_2;k--) f[j][k]=max(f[j][k],f[j-weight_1][k-weight_2]+cost); } int main() {cin>>V>>U>>N;for(int i=1;i<=N;i++)cin>>v[i]>>u[i]>>c[i];for(int i=0;i<=V;i++)//邊界設(shè)定for(int j=0;j<=U;j++) f[i][j]=0; for(int i=1;i<=N;i++)TwoDimensionPack(v[i],u[i],c[i]);cout<<f[V][U]<<endl;return 0; }【分組背包】
#include<iostream> #define MAX 101 using namespace std; int V,N,T; int group[MAX][MAX],w[MAX],c[MAX],f[MAX]; void GroupPack(int group_number,int num) {for(int j=v;j>=0;j--)for(int k=1;k<=group_number;k++){int q=group[num][k];//物品序號(hào)if(j>=w[q])f[j]=max(f[j],f[j-w[q]]+c[q]);} } int main() {cin>>V>>N>>T;//T代表物品組數(shù)for(int i=1;i<=n;i++){int p;cin>>w[i]>>c[i]>>p;//p代表物品屬于哪一組group[p][++group[p][0]]=i;//group[p][0]代表第p組可存儲(chǔ)的元素個(gè)數(shù)}for(int i=1;i<=t;i++)GroupPack(group[i][0],i);//第i組存儲(chǔ)的元素個(gè)數(shù)與組號(hào)cout<<f[V]<<endl;return 0; }【求背包問題方案總數(shù)】
#include<iostream> #define MAX 101 using namespace std; int V,N; int w[MAX]; long long f[MAX]; int main() {cin>>N>>V;f[0]=1;for(int i=1;i<=N;i++)cin>>w[i];for(int i=1;i<=N;i++)for(int j=w[i];j<=V;j++)f[j]+=f[j-w[i]];cout<<f[V]<<endl;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的动态规划 —— 背包问题 —— 背包问题模版的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 文件与目录基本操作
- 下一篇: 棋盘游戏(HDU-1281)