當(dāng)前位置:
首頁(yè) >
HDOJ 3732 Ahui Writes Word 多重背包
發(fā)布時(shí)間:2025/7/25
35
豆豆
生活随笔
收集整理的這篇文章主要介紹了
HDOJ 3732 Ahui Writes Word 多重背包
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3732
題目大意:阿輝要記單詞,所有單詞的長(zhǎng)度都不超過(guò)10個(gè)字符,每個(gè)單詞都有一定的價(jià)值跟復(fù)雜性,
知道每個(gè)單詞的價(jià)值跟復(fù)雜性都寫下來(lái)了,阿輝寫單詞的總的復(fù)雜度不能超過(guò)C,要你求阿輝可以得到
的最大價(jià)值。
解題思路:乍一看本題為一個(gè)簡(jiǎn)單0 1背包問(wèn)題,但用0 1 背包做的時(shí)間復(fù)雜度為10^9在一秒中內(nèi)不可能
完成,但細(xì)看題目后發(fā)現(xiàn)Vi和Ci都小于等于10也就是說(shuō)價(jià)值和費(fèi)用的種類總共只有一百種,只需要統(tǒng)計(jì)
所有價(jià)值、費(fèi)用相同的數(shù)目及可以將問(wèn)題轉(zhuǎn)化為一個(gè)多重背包問(wèn)題。
源碼及注釋:
?
#include<stdio.h> #include<string.h> int count[11][11]; //用于統(tǒng)計(jì)相同價(jià)值和費(fèi)用的單詞的數(shù)目 int dp[10005]; int max(int a,int b)//求a和b的最大值 {return a > b ? a : b; } int main() {int n,i,j,v,ci,c;char Str[15];while(scanf("%d%d",&n,&c) != EOF){memset(count,0,sizeof(count));//將所有種類的數(shù)目初始化為0for(i = 0; i < n; i++){scanf("%s%d%d",Str,&v,&ci);count[v][ci]++; //統(tǒng)計(jì)價(jià)值為v費(fèi)用為ci的單詞的數(shù)目}memset(dp,0,sizeof(dp));for(i = 0; i < 11; i++) //i代表價(jià)值{for(j = 0; j < 11; j++) //j代表費(fèi)用{if(count[i][j] == 0) //當(dāng)價(jià)值為i費(fèi)用為j的單詞的數(shù)量為0的時(shí)候則進(jìn)行下一次循環(huán)continue;if(count[i][j] * j >= c) //完全背包{for(int k = j ; k <= c; k++)dp[k] = max(dp[k],dp[k-j]+i);}else{int l = 1;while(l < count[i][j]) //0 1 背包{for(int k = c; k >= l*j; k--)dp[k] = max(dp[k],dp[k-l*j]+l*i);count[i][j] -= l;l <<= 1;}for(int k = c; k >= count[i][j]*j; k--)dp[k] = max(dp[k],dp[k-count[i][j]*j]+count[i][j]*i);}}}printf("%d\n",dp[c]);}return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/LUO257316/archive/2012/08/24/3220837.html
總結(jié)
以上是生活随笔為你收集整理的HDOJ 3732 Ahui Writes Word 多重背包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 字符编码笔记:ASCII,Unicode
- 下一篇: ListView分页