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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 5410 CRB and His Birthday ——(完全背包变形)

發布時間:2023/12/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 5410 CRB and His Birthday ——(完全背包变形) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  對于每個物品,如果購買,價值為A[i]*x+B[i]的背包問題。

  先寫了一發是WA的= =。代碼如下:

1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <set> 5 using namespace std; 6 typedef pair<int,int> pii; 7 8 pii dp[2005]; 9 int w[1005],A[1005],B[1005]; 10 11 int main() 12 { 13 int T;scanf("%d",&T); 14 while(T--) 15 { 16 int m,n;scanf("%d%d",&m,&n); 17 for(int i=1;i<=n;i++) scanf("%d%d%d",w+i,A+i,B+i); 18 for(int i=0;i<=m;i++) dp[i] = pii(0,0); 19 for(int i=1;i<=n;i++) 20 { 21 for(int j=0;j<=m;j++) dp[j] = pii(dp[j].first, 0); 22 for(int j=w[i];j<=m;j++) 23 { 24 if(dp[j-w[i]].first + A[i] + (dp[j-w[i]].second == 0 ? B[i] : 0) > dp[j].first) 25 { 26 dp[j].first = dp[j-w[i]].first + A[i] + (dp[j-w[i]].second == 0 ? B[i] : 0); 27 dp[j].second = 1; 28 } 29 } 30 } 31 printf("%d\n",dp[m].first); 32 } 33 return 0; 34 }

  

  正解是,先跑一遍價值為A[i]+B[i]的01背包,再跑一遍價值為A[i]完全背包。所以上面的代碼錯了大概是因為,這兩個背包的第二個for的方向是不同的,沒辦法一起跑吧(除非用另外一組變量記錄下到前一個為止的dp值,然后就可以同時跑了)。。對背包問題的理解還是不夠深啊。。

————————————————————————————————————————————————————————

  想了一下,感覺上面說的括號里的再用一個數組記錄的方法貌似不太對。。雖然那份代碼AC了- -。。反正跑兩遍的方法肯定是對的。。我說的是這個博客里面的第二個方法:http://www.cnblogs.com/wmxl/p/4749780.html。也有可能是我對完全背包的理解不夠深刻。。先放著再說好了。。

————————————————————————————————————————————————————————

  AC代碼如下:

1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <set> 5 using namespace std; 6 typedef pair<int,int> pii; 7 8 int dp[2005]; 9 int w[1005],A[1005],B[1005]; 10 11 int main() 12 { 13 int T;scanf("%d",&T); 14 while(T--) 15 { 16 int m,n;scanf("%d%d",&m,&n); 17 for(int i=1;i<=n;i++) scanf("%d%d%d",w+i,A+i,B+i); 18 memset(dp,0,sizeof(dp)); 19 for(int i=1;i<=n;i++) 20 { 21 for(int j=m;j>=w[i];j--) dp[j] = max(dp[j], dp[j-w[i]] + A[i] + B[i]); 22 for(int j=w[i];j<=m;j++) dp[j] = max(dp[j], dp[j-w[i]] + A[i]); 23 } 24 printf("%d\n",dp[m]); 25 } 26 return 0; 27 }

?

轉載于:https://www.cnblogs.com/zzyDS/p/6188175.html

總結

以上是生活随笔為你收集整理的HDU 5410 CRB and His Birthday ——(完全背包变形)的全部內容,希望文章能夠幫你解決所遇到的問題。

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