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 多重背包(模板)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArrayList构造方法详解-给默认长
- 下一篇: iOS:多线程的详细介绍