多重背包 (poj 1014)
生活随笔
收集整理的這篇文章主要介紹了
多重背包 (poj 1014)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:Dividing
題意:6種重量的的石頭,每個給定數量,用總重的一半去裝,問能否裝滿.
#include <iostream> #include <algorithm> #include <stdlib.h> #include <time.h> #include <cmath> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <queue> #include <stack> #include <set>#define c_false ios_base::sync_with_stdio(false); cin.tie(0) #define INF 0x3f3f3f3f #define INFL 0x3f3f3f3f3f3f3f3f #define zero_(x,y) memset(x , y , sizeof(x)) #define zero(x) memset(x , 0 , sizeof(x)) #define MAX(x) memset(x , 0x3f ,sizeof(x)) #define swa(x,y) {LL s;s=x;x=y;y=s;} using namespace std ; #define N 20005const double PI = acos(-1.0); typedef long long LL ; int dp[6*N]; int i = 0; int W,a[10]; void ZeroOnePack(int siz, int prise){for(int i = W;i>=siz;i--)dp[i] = max(dp[i], dp[i-siz] + prise); }void CompletePack(int siz, int prise){for(int i = siz; i<= W; i++)dp[i] = max(dp[i], dp[i-siz]+prise); }void MultiplePack(int siz, int prise, int num){if(siz*num >= W){CompletePack(siz,prise);return ;}int k = 1;while(k<num){ZeroOnePack(k*siz, k*prise);num-=k;k*=2;}ZeroOnePack(num*siz, num*prise); }bool cal(){if(W%2 == 0) W/=2;else return false;for(int i =1 ; i <= 6; i++ ){MultiplePack(i,i,a[i]);}if(dp[W] == W)return true;elsereturn false; }int main(void){//freopen("in.txt","r",stdin);while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]){zero(dp);W = 0;for(int j = 1;j <= 6;j++){W+=j*a[j];}if(a[6]== 0 &&a[1] == 0 &&a[2] == 0&& a[3] == 0&& a[4] ==0&& a[5] ==0)break;printf("Collection #%d:\n",++i);if(cal())puts("Can be divided.\n");elseputs("Can't be divided.\n");}return 0; }
?
轉載于:https://www.cnblogs.com/yoyo-sincerely/p/5291614.html
總結
以上是生活随笔為你收集整理的多重背包 (poj 1014)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Studio 提示Err
- 下一篇: 阅读代码