日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

动态规划 —— 背包问题 —— 背包问题模版

發布時間:2025/3/17 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划 —— 背包问题 —— 背包问题模版 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【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]是物品個數,為0時代表可取無限次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++)//邊界設定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];//物品序號if(j>=w[q])f[j]=max(f[j],f[j-w[q]]+c[q]);} } int main() {cin>>V>>N>>T;//T代表物品組數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組可存儲的元素個數}for(int i=1;i<=t;i++)GroupPack(group[i][0],i);//第i組存儲的元素個數與組號cout<<f[V]<<endl;return 0; }

【求背包問題方案總數】

#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; }

?

總結

以上是生活随笔為你收集整理的动态规划 —— 背包问题 —— 背包问题模版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。