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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDOJ 3732 Ahui Writes Word 多重背包

發布時間:2025/7/25 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 多重背包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。