提供多重背包的一些思路

Description

Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever been split into Computer College and Software College in 2002. 
The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0<N<1000) kinds of facilities (different value, different kinds). 

Input

Input contains multiple test cases. Each test case starts with a number N (0 < N <= 50 -- the total number of different facilities). The next N lines contain an integer V (0<V<=50 --value of facility) and an integer M (0<M<=100 --corresponding number of the facilities) each. You can assume that all V are different. 
A test case starting with a negative integer terminates input and this test case is not to be processed. 

Output

For each case, print one line containing two integers A and B which denote the value of Computer College and Software College will get respectively. A and B should be as equal as possible. At the same time, you should guarantee that A is not less than B. 

Sample Input

2
10 1
20 1
3
10 1
20 2
30 1
-1

Sample Output

20 10
40 40

网上的代码:

#include
#include
#include
using namespace std;
int dp[100000],sum,ans;
struct st
{int v;int m;
}data[100000];
void full(int x)
{for(int i=data[x].v;i<=ans;i++)dp[i]=max(dp[i],dp[i-data[x].v]+data[x].v);
}
void one(int x)
{for(int j=1;j<=data[x].m;j++)for(int i=ans;i>=data[x].v;i--)dp[i]=max(dp[i],dp[i-data[x].v]+data[x].v);
}
int main()
{int i,j,n;while(scanf("%d",&n)&&(n>0)){memset(dp,0,sizeof(dp));sum=0;for(i=1;i<=n;i++){scanf("%d%d",&data[i].v,&data[i].m);sum+=data[i].v*data[i].m;}ans=sum/2;for(i=1;i<=n;i++){if(data[i].v*data[i].m>=ans)full(i);elseone(i);}printf("%d %d\n",sum-dp[ans],dp[ans]);}return 0;
}
//母函数方法:
/*注意将数组a,s清零,WA了好几次,测试数据都过。。无语。
*/
#include
#include
int a[250010],s[250010];
int v[55],m[55];
int main()
{int n,i,j,k,sum,ans;while(scanf("%d",&n)&&n>0){sum=0;memset(s,0,sizeof(s));memset(a,0,sizeof(a));for(i=1;i<=n;i++){scanf("%d%d",&v[i],&m[i]);sum+=v[i]*m[i];}for(i=0;i<=v[1]*m[1];i+=v[1])//注意变化。 {s[i]=1;}for(i=2;i<=n;i++){for(j=0;j<=sum;j++){for(k=0;k+j<=sum&&k<=v[i]*m[i];k+=v[i]){a[k+j]+=s[j];}}for(k=0;k<=sum;k++){s[k]=a[k];a[k]=0;}}for(i=sum/2;i>=0;i--){if(s[i]){printf("%d %d\n",sum-i,i);break;}}}return 0;
} 

我的代码:

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<climits>
#include<queue>
#include<vector>
#include<map>
#include<sstream>
#include<set>
#include<stack>
using namespace std;
//typedef long long ll;
//ifstream fin("input.txt");
//ofstream fout("output.txt");
//fin.close();
//fout.close();
int val[60];
int num[60];
int n;
int dp[270000];
int main()
{
int i,j,k;
while(scanf("%d",&n)==1&&n>0)
{
int cnt=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&val[i],&num[i]);
cnt+=num[i]*val[i];
}
int sum=cnt/2;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
for(j=1;j<=num[i];j++)
{

for(k=sum;k>=val[i];k--)
{
dp[k]=max(dp[k],dp[k-val[i]]+val[i]);
}
}
}
printf("%d %d\n",cnt-dp[sum],dp[sum]);

}

return 0;
}

转载于:https://www.cnblogs.com/yskyskyer123/p/4513176.html

Big Event in HDU相关推荐

  1. HDOJ 1171 Big Event in HDU

    背包模版: Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  2. DP Big Event in HDU

    Big Event in HDU Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) T ...

  3. HDU1171-Big Event in HDU

    描述: Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don ...

  4. HDU OJ 动态规划46题解析

    Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955  背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢 ...

  5. HDU中一些DP的题目分类

    DP是难点,供自已以后系统学习. 1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包;第一次做的时候把概率当做 ...

  6. hdu 动态规划题集

    原文链接:http://blog.sina.com.cn/s/blog_6cf509db0100sptt.html点击打开链接 1.Robberies 连接 :http://acm.hdu.edu.c ...

  7. hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)

    HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包 ...

  8. 杭电1171(01背包求解)

    题目: Problem Description Nowadays, we all know that Computer College is the biggest department in HDU ...

  9. 动态规划 4、基础背包问题总结(多重背包与多重背包的转化)

    描述: 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 变式:有的物品 ...

最新文章

  1. P2700 逐个击破
  2. 网上预约挂号系统代码_速看!全国民族运动会部分竞赛项目观众网上预约系统正式上线了...
  3. Scala里的类型擦除 - type erase
  4. [翻译]用 Puppet 搭建易管理的服务器基础架构(3)
  5. sqlserver触发器如何将一个库中的数据插入到另外一个库中
  6. bzoj 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛(floyd)
  7. Native Instruments West Africa for Mac(西非打击乐音色资源)
  8. SVN创建,切换,合并,删除分支
  9. Linux自学,第一天
  10. linux服务器怎么拷贝文件,linux 服务器之间拷贝文件
  11. 著名网站msdn.itellyou.cn原理分析
  12. 自动加减工单结存算法实现
  13. ubuntu 下,用户,文件夹,用户组 之理解
  14. 90°光混频器原理分析
  15. 64位系统装32位计算机,64位电脑装32位系统,教您64位电脑怎么装32位系统
  16. 从DS1302电路设计总结的晶振电路设计规范
  17. 为什么不敢和别人竞争_三千亿碧桂园的残酷竞争:别人能,你为什么不能?
  18. speedoffice(PPT)插入的图片如何裁剪呢?
  19. Android 触摸屏Event上报操作
  20. 2018年下半年软考--软件设计师上午试题及参考答案

热门文章

  1. dispatch_after中时间的计算
  2. Android中Handler的使用方法——在子线程中更新界面
  3. (04)VHDL实现打两拍
  4. (44)FPGA面试题CMOS和TTL电路区别
  5. 2.c++模式设计-工厂模式
  6. 2001.dumpbin工具使用
  7. TCP和UDP服务器性能测试工具
  8. 利用python安装opencv_科学网—Anaconda Python PyCharm PyQT5 OpenCV PyTorch TF2.0 安装指南 - 张重生的博文...
  9. oracle中master实例,Oracle10g/11g RAC数据库中的Master实例、Owner实例和Past Image的概念PART2...
  10. mysql ssl jdbc_【MySQLSSLJAVA】关于MySQL开启SSL后,jdbc的配置