程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 1004 Dividing

poj 1004 Dividing

編輯:C++入門知識

poj 1004 Dividing


題目大意是,從輸入六個數 ,第i個數代表價值為i的有幾個,平均分給兩個人 ,明擺著的背包問題,本來以為把他轉化為01背包,但是TLe,後來發現是12萬的平方還多,所以妥妥的TLE,後來發現這是一個完全背包問題,然後即糾結了 ,沒學過啊 ,最後發現思想好i是蠻簡單的,水水的A掉了,最後注意一下初始化問題和輸入問題後就好了

#include 
#include 
int a[10];
int dp[120005];
int maxx(int a,int b)
{
    return (a>b)?a:b;
}
int main()
{
    int cases=0;
    while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])!=EOF)
    {
        memset(dp,0,sizeof(dp));
        int sum=0;
        if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
            break;
        for(int i=1;i<7;i++)
        {
            sum+=a[i]*i;
        }
        int mount;
        int i,j,k;
       // printf(" %d\n",sum);
        if(sum%2)//當時奇數的時候肯定不能分開
        {
            printf("Collection #%d:\nCan't be divided.\n\n",++cases);
        }
        else
        {
          for(i=1;i<=6;i++) 
       {
		  // printf("%d %d ",sum,a[i]);
           mount=a[i];
		 // printf("%d\n",mount);
		  dp[0]=1;//初始化為1。如果不初始化的話,因為dp【1】+=dp【0】;
        for(k=1;k<=mount;k*=2) 
        { 
          for(j=sum/2;j>=k*i;j--) 
             dp[j]+=dp[j-k*i]; 
             mount-=k; 
        } 
          if(mount) 
          for(j=sum/2;j>=mount*i;j--) //從sum/2開始  最後能不能有,有就一定是sum/2;
            dp[j]+=dp[j-mount*i]; 
        } 
          //for(int i=0;i

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved