** 浙大PAT甲级 1068 01背包问题
2016-08-27 10:34
751 查看
这个题是dp01背包问题,dp[i][j]表示在j容量下前i个货币最大利益,但是难点在如何输出最小序列。
将输入的数按递减顺序排序,mark[i][j]==1表示在容量为j时的最大的利益情况下,加入了第i个货币。
然后进行回溯输出。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf -100000000
using namespace std;
int a[10004];
int dp[10004][105];
int mark[10004][105];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
for(int j=m;j>=a[i];j--)
{
int tmp=dp[i-1][j-a[i]]+a[i];
if(dp[i-1][j]>tmp)
{
dp[i][j]=dp[i-1][j];
}
else
{
dp[i][j]=tmp;
mark[i][j]=1;
}
}
}
if(dp
[m]!=m)
{
printf("No Solution");
}
else
{
vector<int> v;
while(m)
{
while(!mark
[m])
{
n--;
}
v.push_back(a
);
m-=a
;
n--;
}
int i;
for(i=0;i<v.size()-1;i++)
{
printf("%d ",v[i]);
}
printf("%d",v[i]);
}
}
将输入的数按递减顺序排序,mark[i][j]==1表示在容量为j时的最大的利益情况下,加入了第i个货币。
然后进行回溯输出。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf -100000000
using namespace std;
int a[10004];
int dp[10004][105];
int mark[10004][105];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
for(int j=m;j>=a[i];j--)
{
int tmp=dp[i-1][j-a[i]]+a[i];
if(dp[i-1][j]>tmp)
{
dp[i][j]=dp[i-1][j];
}
else
{
dp[i][j]=tmp;
mark[i][j]=1;
}
}
}
if(dp
[m]!=m)
{
printf("No Solution");
}
else
{
vector<int> v;
while(m)
{
while(!mark
[m])
{
n--;
}
v.push_back(a
);
m-=a
;
n--;
}
int i;
for(i=0;i<v.size()-1;i++)
{
printf("%d ",v[i]);
}
printf("%d",v[i]);
}
}
相关文章推荐
- **浙大PAT甲级 1098堆排序
- **PAT浙大甲级 1095
- PAT程序设计考题——甲级1068 (背包问题) C++实现
- 浙大PAT甲级 1041
- 浙大PAT甲级 1030
- PAT程序设计考题——甲级1008(Elevator电梯时间计算问题)
- PAT 甲级 1068 Find More Coins(0,1背包)
- pat1068 01背包 排序+打印路径
- 浙大PAT甲级 1040
- 浙大PAT甲级 1028
- 浙大PAT甲级 1029
- 浙大PAT甲级 1033
- 【PAT 1068】 Find More Coins 背包问题
- 浙大PAT甲级 1035
- 浙大PAT甲级 1037
- 1049. Counting Ones (30)-PAT甲级真题(数学问题)
- 浙大PAT 2-09. 装箱问题模拟 (解题思路)
- 浙大PAT 1008. 数组元素循环右移问题 (解题思路)
- pat甲级_路径问题(例题:pat 1003 Emergency (25))
- 浙大PAT甲级 1032