hdu3033---加限制条件的0-1背包
2 #include<stdio.h>
3 #include<string.h>
4 ?int n,m,k,p[101],max=0,v[101];
5 ?int br[11][101],sum[11] ;
6 long f[11][10001];
7
8 int main(){
9 int i,j,x,i1;
10 while(scanf("%d%d%d",&n,&m,&k)!=EOF)
11 {
12 memset(sum,0,sizeof(sum));
13 for(i=1;i<=n;i++)
14 {
15 scanf("%d%d%d",&x,&p[i],&v[i]);
16 br[x][++sum[x]]=i;
17 }
18 for(i=1;i<=k;i++)
19 for(j=1;j<=m;j++)
20 f[i][j]=-1;
21 for(j=1;j<=m;j++)
22 f[0][j]=0;
23 for(i=1;i<=k;i++)---------表示品牌編號
24 for(i1=1;i1<=sum[i];i1++)--------表示i品牌下的產品編號
25 for(j=m;j>=1;j--)-------------表示可以花費的錢,注意要倒寫
26 {
27 if(j>=p[br[i][i1]])
28 {
29 if(f[i][j-p[br[i][i1]]]!=-1&&f[i][j]<f[i][j-p[br[i][i1]]]+v[br[i][i1]])
30 f[i][j]=f[i][j-p[br[i][i1]]]+v[br[i][i1]];
31 if(f[i-1][j-p[br[i][i1]]]!=-1&&f[i][j]<f[i-1][j-p[br[i][i1]]]+v[br[i][i1]])
32 f[i][j]=f[i-1][j-p[br[i][i1]]]+v[br[i][i1]];
33 }
34 }
35 if(f[k][m]<0)printf("Impossible\n");
36 else
37 printf("%d\n",f[k][m]);
38 }
39 return 0;
40 }
?
????? 程序思想:f[i][j]代表用j的價錢買前i個品牌可以得到的最大價值數。
?????? 賦初值:見18到22行
??????狀態轉移:f[i][j]可以經過三種狀態得到————?
????? f[i][j],f[i-1][j-p[br[i][i1]]]+v[br[i][i1]],f[i][j-p[br[i][i1]]]+v[br[i][i1]]?????????????????????????????????????
????? br[i][i1]代表第i種品牌的第i1個產品,p[]是某產品的價格,v[]是某產品的價值。
????? 意思是,當放到第i個品牌的第i1個產品時,它的狀態等于不放第i1個產品,而放i1
????? 以前的i類品牌中的某些產品(f[i][j]),放i類品牌的第i1個產品,而不放i的其他
????? 產品(f[i-1][j-p[br[i][i1]]]+v[br[i][i1]]),放i類的第i1個產品,同時也放i類中i1以前
????? 的某些產品 (f[i][j-p[br[i][i1]]]+v[br[i][i1]] ) 。
???????
?????? 幾個問題:
?????? 1.如何保證每一類品牌至少放一件產品?
?????? 答:首先看循環:
??????? for(i=1;i<=k;i++)
??????? for(i1=1;i1<=sum[i];i1++)
?????? for(j=m;j>=1;j--)
?????? if(j>=p[br[i][i1]])----限制條件
???????在某一狀態存在的情況下(不等于-1),找出三種狀態中最大的,賦值給f[i][j] .由于開始時所有f[i][j](i!=0)都為-1,所以i=1
?????? 更新時一定會從f[0][]開始,而此時就可保證當i=1時,f[i][j]中所有值不為-1的狀態一定裝了品牌1的某個物品。而當i>1時,
?????? 要想得到最初的f[i][j],一定是從已經放有前i-1個品牌的某個狀態得到的,而更新最初的f[i][j] 也一定會用到i品牌的某
?????? 個產品(都可由狀態轉移方程可知)。
?????? 總之,保證每一類品牌 至少放一件產品是通過賦初值,條件判斷,狀態轉移三方面實現的。
????? 2.如何抱證每個產品只放一次?
??????? 答: 注意循環安排順序:將對某一品牌產品編號的循環放在對限制總錢數的循環之前 。
?
轉載于:https://www.cnblogs.com/aiyite826/archive/2010/07/23/1783879.html
總結
以上是生活随笔為你收集整理的hdu3033---加限制条件的0-1背包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux用户和用户组管理常见问题
- 下一篇: 详解通过ProxySQL提升PHP/My