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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu3033---加限制条件的0-1背包

發(fā)布時間:2023/12/31 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu3033---加限制条件的0-1背包 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代碼 1 #include<stdlib.h>
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品牌下的產(chǎn)品編號
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個品牌可以得到的最大價值數(shù)。
?????? 賦初值:見18到22行
??????狀態(tài)轉移:f[i][j]可以經(jīng)過三種狀態(tài)得到————?
????? 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個產(chǎn)品,p[]是某產(chǎn)品的價格,v[]是某產(chǎn)品的價值。
????? 意思是,當放到第i個品牌的第i1個產(chǎn)品時,它的狀態(tài)等于不放第i1個產(chǎn)品,而放i1
????? 以前的i類品牌中的某些產(chǎn)品(f[i][j]),放i類品牌的第i1個產(chǎn)品,而不放i的其他
????? 產(chǎn)品(f[i-1][j-p[br[i][i1]]]+v[br[i][i1]]),放i類的第i1個產(chǎn)品,同時也放i類中i1以前
????? 的某些產(chǎn)品 (f[i][j-p[br[i][i1]]]+v[br[i][i1]] ) 。
???????
?????? 幾個問題
?????? 1.如何保證每一類品牌至少放一件產(chǎn)品
?????? 答:首先看循環(huán):
??????? 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]])----限制條件
???????在某一狀態(tài)存在的情況下(不等于-1),找出三種狀態(tài)中最大的,賦值給f[i][j] .由于開始時所有f[i][j](i!=0)都為-1,所以i=1
?????? 更新時一定會從f[0][]開始,而此時就可保證當i=1時,f[i][j]中所有值不為-1的狀態(tài)一定裝了品牌1的某個物品。而當i>1時,
?????? 要想得到最初的f[i][j],一定是從已經(jīng)放有前i-1個品牌的某個狀態(tài)得到的,而更新最初的f[i][j] 也一定會用到i品牌的某
?????? 個產(chǎn)品(都可由狀態(tài)轉移方程可知)。
?????? 總之,保證每一類品牌 至少放一件產(chǎn)品是通過賦初值,條件判斷,狀態(tài)轉移三方面實現(xiàn)的。
????? 2.如何抱證每個產(chǎn)品只放一次
??????? 答: 注意循環(huán)安排順序:將對某一品牌產(chǎn)品編號的循環(huán)放在對限制總錢數(shù)的循環(huán)之前 。

?

轉載于:https://www.cnblogs.com/aiyite826/archive/2010/07/23/1783879.html

總結

以上是生活随笔為你收集整理的hdu3033---加限制条件的0-1背包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。