青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

M.J的blog

algorithm,ACM-ICPC
隨筆 - 39, 文章 - 11, 評論 - 20, 引用 - 0
數據加載中……

多重背包問題

今天看了下多重背包,理解的還不夠深入,不過因為是01背包過來的,所以接受起來很容易。
主要是運用了二進制的思想將一個數量為N很大的物品分為了logN個數量小的物品,而這logN個物品可以組成數量為0到N任意數量,所以這種策略是
成立的。
多重背包問題有TOJ1034,TOJ1670.

TOJ1034 :
大意是有6種規格的石頭,編號從1到6,編號為 i 的石頭的價值為 i .現在給出各種石頭的數量,問有沒有可能得到總價值的一半。
做法:    DP, 每種石頭價值為v[i],價值為 i ,數量為 num[i] ,通過多重背包看能不能恰好取得總價值的一半。
           一個優化是總價值為奇數直接不用考慮,而在DP的時候設置一個標記來記錄是否已經取得總價值一半,如果取得則可以返回。
做法2:這種方法的前提是POJ  discuss里的一種做法,即給每個石頭的數量mod 8。證明是用抽屜原理證的,很復雜,我沒有看。但是這樣以來,數量
            一下子大大減少,極大的提高了效率。
            我說的做法2事實上是我的最初做法,即DFS,搜索,在搜索過程中注意剪枝,再加上數量取模的優化,復雜度也不高。 

Code for 1034(Dividing):
import java.util.Scanner;

import java.util.
*;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
public class Main {
    
public static int f[] = new int[20001*6];                                                // f[i]表示容量為 i 的背包最多能裝的物品的價值
    
public static int v[] = new int[7];
    
public static int num[] = new int[7];
    
public static int total,flag,key;                                                               //total為 6 種大理石的總價值 ,flag為標記,一旦為1表示可以取得,可以返回了
    
public static void onezeropack(int cost,int weight) {                           //  01背包函數,注意循環是從total 到 cost,不要弄反
             
int i;
             
for(i = total;i >= cost; i--) {
                        f[i] 
= Math.max(f[i],f[i-cost]+weight);
                       
if(f[i] == key) {                                                                 // 如果可以取得總價值一半,flag=1,返回
                                  flag 
= 1;
                                 
return ;
                        }
              }
    }
    
public static void finishpack(int cost,int weight) {                            
             
int i;
             
if(flag==1return ;
             
for(i = cost;i <= total; i++) {
                         f[i] 
= Math.max(f[i], f[i-cost]+weight);
                       
if(f[i] == key) {
                                flag 
= 1;
                               
return ;
                        }
              }
    }
    
public static void multipack(int cost,int weight,int amount) {
                
if(cost*amount >= total) {
                            finishpack(cost, weight);
                           
return ;
                 }
                
if(flag==1return ;
                
int k = 1;
                
while(k < amount) {                                                                                        // 該過程即為將一件物品拆分為1,2,4...2^k 件物品進行01背包過程
                            onezeropack(k
*cost, k*weight);
                            amount 
-= k;
                            k 
*= 2;
                 }
                 onezeropack(cost
*amount, weight*amount);
    }
    
public static void main(String[] args){
                 Scanner 
in = new Scanner(System.in);
                
int i,j,cas = 1;
                
while(true) {
                            Arrays.fill(f,
0);
                            total 
= 0; flag = 0;
                           
for(i = 1;i <= 6; i++) {
                                       num[i] 
= in.nextInt();
                                       v[i] 
= i;
                                       total 
+= i*num[i];
                            }
                          
if(num[1]==0&&num[2]==0&&num[3]==0&&num[4]==0&&num[5]==0&&num[6]==0)
                                     
break;
                          
if(total%2==1) flag = 0;
                          
else {
                                     key 
= total/2;
                                    
for(i = 1;i <= 6; i++
                                     multipack(i, i, num[i]);
                           }
                           System.
out.println("Collection #"+cas+":");
                          
if(flag==0) System.out.println("Can't be divided.");
                          
else System.out.println("Can be divided.");
                           System.
out.println();
                           cas
++;
                }
    }

}

TOJ 1670:
          大意是一臺取款機有N中貨幣,每種貨幣面值為 V[i] ,數量為 num[i] , 給出一個價值,為在這個價值之內(包括這個價值)最大能取得多大。
分析:典型的多重背包,給出的價值即為背包容量,每種貨幣為一種物品,價值為v[i] , 數量為num[i],求能得到的最大價值。
          注釋就不加了,參考上面的程序

Code for 1670(Cash Mechine):

#include <cstdio>
#include 
<cstring>

int f[100002],v[12],num[12],cost[12];
int total,n;
int max(int a,int b){ return a>b?a:b;}

void OneZeroPack(int cost,int value){
          
int i,j;
          
for(i = total;i >= cost; i--)
                   f[i] 
= max(f[i],f[i-cost]+value);

}
void completePack(int cost,int weight){
          
int i;
          
for(i = cost;i <= total; i++)
                   f[i] 
= max(f[i],f[i-cost]+weight);
}
void multiPack(int cost,int weight,int amount){
          
if(cost*amount >= total){
                   completePack(cost,weight);
                  
return ;
           }
          
int k = 1;
          
while(k < amount){
                   OneZeroPack(k
*cost,k*weight);
                   amount 
-= k;
                   k
*=2;
           }
           OneZeroPack(cost
*amount,amount*weight);
}
int main(){
          
int i,j,k;
          
while(scanf("%d%d",&total,&n)!= EOF){
                   memset(f,
0,sizeof(f));
          
for(i = 1;i <= n; i++){
                   scanf(
"%d%d",&num[i],&cost[i]);
                   v[i] 
= cost[i];
           }
          
for(i = 1;i <= n; i++)
                   multiPack(cost[i],v[i],num[i]);
                   printf(
"%d\n",f[total]);    
           }
}



posted on 2010-07-07 20:18 M.J 閱讀(807) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品一区二区三区四区高清| 亚洲精品中文字幕女同| 国产精品乱码| 国产精品久久久久高潮| 国产精品一区久久| 国产精品亚洲人在线观看| 国内在线观看一区二区三区| 黄色成人av网| 久久亚洲二区| 亚洲黄一区二区三区| 日韩午夜在线| 亚洲中无吗在线| 久久综合九九| 欧美好吊妞视频| 国产精品久久久久久久午夜| 午夜日韩激情| 欧美成人午夜激情在线| 99re成人精品视频| 久久美女艺术照精彩视频福利播放| 亚洲美女少妇无套啪啪呻吟| 国产精品电影网站| 欧美中文字幕| 亚洲精品一区在线观看| 国产精品久久777777毛茸茸| 久久久久在线观看| 一区二区三区视频在线| 老司机免费视频久久| 国产亚洲一区精品| 亚洲午夜黄色| 亚洲国产成人不卡| 久久久精品动漫| 国产精品日韩高清| 六十路精品视频| 午夜欧美大片免费观看| 欧美日韩一区二区免费视频| 亚洲第一在线综合网站| 久久经典综合| 午夜激情亚洲| 国产欧美日韩高清| 欧美伊人久久| 香蕉乱码成人久久天堂爱免费| 亚洲高清在线精品| 欧美激情精品久久久久久久变态| 欧美一区二区视频观看视频| 国产模特精品视频久久久久| 亚洲激情一区| 韩国av一区二区三区| 99这里只有久久精品视频| 欧美日韩在线播| 欧美大尺度在线| 国产午夜精品久久| 榴莲视频成人在线观看| 国产精品久久久久久久久久久久| 农村妇女精品| 欧美三级在线视频| 亚洲综合清纯丝袜自拍| 免费在线欧美黄色| 夜夜嗨av一区二区三区四季av| 亚洲精品国久久99热| 欧美四级剧情无删版影片| 亚洲电影欧美电影有声小说| ●精品国产综合乱码久久久久| 亚洲一区二区三区免费在线观看| 国产精品乱人伦一区二区 | 国产精品爱啪在线线免费观看| 亚洲图色在线| 欧美一区精品| 午夜日本精品| 国产欧美精品日韩区二区麻豆天美| 日韩亚洲成人av在线| 日韩一区二区精品葵司在线| 欧美11—12娇小xxxx| 亚洲第一狼人社区| 亚洲韩国青草视频| 亚洲一品av免费观看| 精品动漫3d一区二区三区免费| 亚洲国产另类精品专区| 欧美日一区二区在线观看| 亚洲精品视频免费在线观看| 99亚洲视频| 欧美日韩视频在线一区二区| 一道本一区二区| 亚洲欧美一区二区三区在线| 国产精品日韩| 久久激情综合网| 亚洲无限av看| 国产精品三级视频| 亚洲欧美日韩在线高清直播| 久久亚裔精品欧美| 亚洲精品美女91| 性xx色xx综合久久久xx| 久久久综合精品| 亚洲激情av在线| 欧美日韩国产成人| 久久亚洲综合色| 亚洲第一精品夜夜躁人人躁| 欧美精品亚洲| 欧美凹凸一区二区三区视频| 亚洲日本电影在线| 欧美视频网站| 久久精品亚洲精品| 最新日韩中文字幕| 欧美中文字幕视频| 亚洲国产婷婷| 国产精品免费看久久久香蕉| 久久午夜av| 亚洲一区二区三区激情| 欧美va天堂| 性欧美超级视频| 国产精品裸体一区二区三区| 久久精品99国产精品日本 | 午夜久久久久| 影音先锋久久久| 欧美一区二区三区免费视| 欧美1区视频| 新67194成人永久网站| 亚洲精品亚洲人成人网| 国产日本欧洲亚洲| 欧美精品在线观看| 亚洲国产三级在线| 欧美在线亚洲在线| 99成人免费视频| 在线播放不卡| 国产在线欧美日韩| 久久精品国产免费看久久精品| 亚洲激情社区| 欧美不卡视频一区发布| 欧美一区二区三区四区夜夜大片| 最近中文字幕mv在线一区二区三区四区| 久久午夜激情| 午夜欧美精品久久久久久久| 99精品福利视频| 亚洲欧洲精品天堂一级| 久久亚洲高清| 久久久久久穴| 久久精品国产亚洲5555| 亚洲欧美伊人| 亚洲一区二区三区精品动漫| 亚洲精品日韩欧美| 亚洲国产一区二区三区在线播| 一区二区三区在线视频免费观看 | 免费欧美日韩国产三级电影| 欧美一区二区免费观在线| 国产精品99久久久久久人| 欧美亚洲一区三区| 先锋影音网一区二区| 午夜精品国产| 午夜精品福利一区二区蜜股av| 亚洲在线观看视频网站| 亚洲一二区在线| 亚洲伊人伊色伊影伊综合网| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲国产成人久久综合| 女同性一区二区三区人了人一 | 亚洲欧美国产精品va在线观看| 国产亚洲视频在线| 国产三级欧美三级| 国产视频自拍一区| 国模私拍一区二区三区| 国产一区二区精品丝袜| 一区二区在线看| 亚洲国产另类精品专区| 亚洲精品综合精品自拍| 在线亚洲观看| 亚洲激情图片小说视频| 亚洲免费观看高清完整版在线观看| 亚洲欧洲在线观看| 亚洲午夜国产一区99re久久| 欧美一区二区网站| 久久久久久久999精品视频| 亚洲精品视频免费观看| 亚洲系列中文字幕| 久久精品女人的天堂av| 老司机aⅴ在线精品导航| 欧美国产精品v| 一本色道久久综合亚洲精品不| 午夜视频一区| 欧美插天视频在线播放| 久久国产精彩视频| 欧美国产在线观看| 国产精品影视天天线| 亚洲福利视频专区| 亚洲影音一区| 亚洲成在线观看| 免费欧美日韩| 久久综合999| 99亚洲精品| 久久精品一区蜜桃臀影院| 欧美区在线观看| 国产一区二区三区在线观看精品 | 亚洲第一页在线| 亚洲午夜免费福利视频| 麻豆精品一区二区av白丝在线| 久久精品最新地址| 欧美激情在线观看| 国产亚洲欧美日韩在线一区| 一区二区三区免费在线观看| 久久精品中文字幕免费mv| 亚洲日本中文| 久久国产精品久久久久久|