HDOJ 3732 Ahui Writes Word 多重背包
生活随笔
收集整理的這篇文章主要介紹了
HDOJ 3732 Ahui Writes Word 多重背包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3732
題目大意:阿輝要記單詞,所有單詞的長度都不超過10個字符,每個單詞都有一定的價值跟復雜性,
知道每個單詞的價值跟復雜性都寫下來了,阿輝寫單詞的總的復雜度不能超過C,要你求阿輝可以得到
的最大價值。
解題思路:乍一看本題為一個簡單0 1背包問題,但用0 1 背包做的時間復雜度為10^9在一秒中內不可能
完成,但細看題目后發現Vi和Ci都小于等于10也就是說價值和費用的種類總共只有一百種,只需要統計
所有價值、費用相同的數目及可以將問題轉化為一個多重背包問題。
源碼及注釋:
?
#include<stdio.h> #include<string.h> int count[11][11]; //用于統計相同價值和費用的單詞的數目 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));//將所有種類的數目初始化為0for(i = 0; i < n; i++){scanf("%s%d%d",Str,&v,&ci);count[v][ci]++; //統計價值為v費用為ci的單詞的數目}memset(dp,0,sizeof(dp));for(i = 0; i < 11; i++) //i代表價值{for(j = 0; j < 11; j++) //j代表費用{if(count[i][j] == 0) //當價值為i費用為j的單詞的數量為0的時候則進行下一次循環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; }
?
轉載于:https://www.cnblogs.com/LUO257316/archive/2012/08/24/3220837.html
總結
以上是生活随笔為你收集整理的HDOJ 3732 Ahui Writes Word 多重背包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符编码笔记:ASCII,Unicode
- 下一篇: SQL循环执行while控制