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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

01背包模板、全然背包 and 多重背包(模板)

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 01背包模板、全然背包 and 多重背包(模板) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請注明出處:http://blog.csdn.net/u012860063


貼一個自覺得解說不錯的鏈接:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html


模版就直接貼代碼:


01背包模板:

/* 01背包問題 01背包問題的特點是,">每種物品僅有一件。能夠選擇放或不放。

01背包問題描寫敘述: 有N件物品和一個容量為V的背包。

第i件物品的重量是c[i],價值是w[i]。

求解將哪些物品裝入背包可使這些物品的重量總和不超過背包容量,且價值總和最大。 */ #include <stdio.h> #define N 1050017 int max(int x,int y) { int M; M=x>y ?

x : y; return M; } int wei[N],val[N],f[N]; int main() { int i, j, n, m; while(scanf("%d",&n)!=EOF) { scanf("%d", &m); for(i=0; i<n; i++) scanf("%d%d", &wei[i],&val[i]);//wei[i]為重量,val[i]為價值 for(i=0; i<n; i++) { for(j=m; j>=wei[i]; j--) f[j] = max(f[j], f[j-wei[i]]+val[i]); } printf("%d\n",f[m]); } return 0; } //此代碼為poj3624




全然背包模板:

/* 全然背包問題的特點是,每種物品能夠無限制的反復使用。能夠選擇放或不放。 全然背包問題描寫敘述: 有N物品和一個容量為V的背包。第i件物品的重量是wei[i],價值是val[i]。 */#include <cstdio> #define INF 0x3fffffff #define N 10047 int f[N],val[N],wei[N]; int min(int a,int b) {if(a < b)return a;return b; } int main() {int t,i,j,k,E,F,m,n;scanf("%d",&t);while(t--){scanf("%d%d",&E,&F);int c = F-E;for(i = 0 ; i <= c ; i++)f[i]=INF;scanf("%d",&n);for(i = 0 ; i < n ; i++){scanf("%d%d",&val[i],&wei[i]);//val[i]為面額。wei[i]為重量}f[0]=0;//由于此處如果的是小豬儲錢罐 恰好裝滿 的情況//注意初始化(要求恰好裝滿背包,那么在初始化時除了f[0]為0其他f[1..V]均設為-∞。//這樣就能夠保證終于得到的f[N]是一種恰好裝滿背包的最優解。//如果并沒有要求必須把背包裝滿。而是僅僅希望價格盡量大,初始化時應該將f[0..V]所有設為0)for(i =0 ; i < n ; i++){for(j = wei[i] ; j <= c ; j++){f[j] = min(f[j],f[j-wei[i]]+val[i]);//此處求的是最壞的情況所以用min。確定最少的錢,當然最后就用max了。HEHE}}if(f[c] == INF)printf("This is impossible.\n");elseprintf("The minimum amount of money in the piggy-bank is %d.\n",f[c]);}return 0; } //此代碼為HDU1114;

? ??f[w] 即為所求 ?
??????? 初始化分兩種情況:
??????? 1、假設背包要求正好裝滿則初始化 f[0] = 0, f[1~w] = -INF; ?

??????? 2、假設不須要正好裝滿 f[0~v] = 0;




多重背包模板:

//多重背包(MultiplePack): 有N種物品和一個容量為V的背包。 //第i種物品最多有n[i]件可用,每件費用是c[i],價值是w[i]。 //求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量, //且價值總和最大。

//HDU 2191 #include <cstdio> #include <cstring> #define N 247 int max(int a,int b) { if(a > b) return a; else return b; } int main() { int t,n,m,i,j,k; int w[N],pri[N],num[N],f[N]; while(~scanf("%d",&t)) { while(t--) { memset(f,0,sizeof(f)); scanf("%d%d",&n,&m);//n為總金額,m為大米種類 for(i = 0 ; i < m ; i++) { scanf("%d%d%d",&pri[i],&w[i],&num[i]);//num[i]為每種大米的袋數 } for(i = 0 ; i < m ; i++) { for(k = 0 ; k < num[i] ; k++) { for(j = n ; j >= pri[i]; j--) { f[j] = max(f[j],f[j-pri[i]]+w[i]); } } } printf("%d\n",f[n]); } } return 0; }



總結

以上是生活随笔為你收集整理的01背包模板、全然背包 and 多重背包(模板)的全部內容,希望文章能夠幫你解決所遇到的問題。

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