我不知道怎么用DP,不过DFS挺好用。DFS思路很明显,搜索、记录,如果刚好找到总价值的一半就说明搜索成功。
题目大意:每组6个数,分别表示价值1到6的物品个数。现在问你能不能根据价值均分。
Sample Input //6种价值物品的个数,全为0时结束
1 0 1 2 0 0
1 0 0 0 1 1
0 0 0 0 0 0
Sample Output //注意格式,空两行
Collection #1:Can‘t be divided.
Collection #2:Can be divided.
1 #include<iostream> 2 using namespace std; 3 4 int N[7];//存数量 5 int Sum,T=1,i; 6 bool flag;//标记 7 8 void dfs(int s,int p) 9 { 10 if(s==Sum/2)//找到了价值刚好为一半 11 { 12 flag=true; 13 return; 14 } 15 for(int i=p;i>=1;i--)//搜索,似乎和DP有点像啊 16 { 17 if(N[i]) 18 { 19 if(s+i<=Sum/2) 20 { 21 N[i]--; 22 dfs(s+i,i); 23 if(flag) 24 break; 25 } 26 } 27 } 28 return; 29 } 30 31 32 int main() 33 { 34 while(1) 35 { 36 Sum=0; 37 for(i=1;i<=6;i++) 38 { 39 cin>>N[i]; 40 Sum+=i*N[i];//算出价值总和 41 } 42 if(!Sum)//全0 43 break; 44 if(Sum%2)//总价值为奇数时不成立,剪枝 45 { 46 cout<<"Collection #"<<T<<":\nCan‘t be divided.\n\n"; 47 T++; 48 continue; 49 } 50 51 flag=false; 52 53 dfs(0,6); 54 55 if(flag) 56 { 57 cout<<"Collection #"<<T<<":\nCan be divided.\n\n"; 58 T++; 59 continue; 60 } 61 else 62 { 63 cout<<"Collection #"<<T<<":\nCan‘t be divided.\n\n"; 64 T++; 65 continue; 66 } 67 } 68 return 0; 69 }
时间: 2024-12-26 12:56:23