题目大意:
给你6种石头,包括每种石头的个数,求是否可以将这些石头平分
.......................................
这题很简单的多重背包!!!
具体有多简单?
一般的多重背包用暴力肯定超时!!!
然而这道题用暴力稍微优化一点点不会超时!!!!!
然而我超时!!!
我用的多重背包超时了!!!
exm??
暴力AC代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <algorithm> #include <climits> #include <queue> #define ll long long using namespace std; int dp[120005],w[10]; int main(void) { int ans,sum,cnt = 1; while(scanf("%d",&w[1]) != -1) { sum = 0; ans = 0; if(w[1] != 0) ans= 1; sum += w[1]; for(int i = 2; i <= 6; i++) { scanf("%d",&w[i]); sum += w[i]*i; if(w[i]) ans = 1; } if(!ans) break; if(sum % 2 == 1) { printf("Collection #%d:\nCan't be divided.\n\n",cnt++); } else { memset(dp,0,sizeof(dp)); for(int i = 0; i <= w[i] && i <= sum/2; i++) dp[i] = 1; for(int i = 2; i <= 6; i++) for(int j = sum/2; j >= 0; j--) { if(dp[j] == 0) continue; for(int k = 1; k <= w[i] && k *i+j <= sum/2; k++) { if(dp[k*i+j]) break; dp[k*i+j] = 1; } } if(dp[sum/2] == 1) printf("Collection #%d:\nCan be divided.\n\n",cnt++); else printf("Collection #%d:\nCan't be divided.\n\n",cnt++); } } return 0; } 找了半天才发现数组开小了!!!好吧,提示是TL我根本没往RE方面想
心态炸了!
多重背包AC代码:
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int num[8]; int dp[120005]; int step=1,k=1; int w[10000]; void divild(int i,int n) { while(n>1) { int a=(n+1)/2; int b=n/2; w[k++]=a*i; n=b; } w[k++]=i; } int main() { while(scanf("%d%d%d%d%d%d",&num[1],&num[2],&num[3],&num[4],&num[5],&num[6])!=EOF) { if(num[1]==0&&num[2]==0&&num[3]==0&&num[4]==0&&num[5]==0&&num[6]==0) { break; } int sum=0,ans=0; k=1; for(int i=1; i<=6; i++) { sum+=num[i]; ans+=num[i]*i; if(num[i]!=0) { divild(i,num[i]); } } // for(int i=1; i<k; i++) // { // printf("%d\n",w[i]); // } int m=ans/2; if(ans%2!=0) { printf("Collection #%d:\nCan't be divided.\n\n",step++); continue; } for(int i=1; i<=m; i++) { dp[i]=-9999999; } dp[0]=0; for(int i=1; i<k; i++) { for(int j=m; j>=w[i]; j--) { dp[j]=max(dp[j],dp[j-w[i]]+1); } } if(dp[m]>0) printf("Collection #%d:\nCan be divided.\n\n",step++); else printf("Collection #%d:\nCan't be divided.\n\n",step++); } }