这几天都在看dp好难啊,初学算法,的确了解到它的精妙之处,有时候更要好好体会,更需要总结
首先看一下贪心和dp不同之处
1.有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
#include<bits/stdc++.h>
using namespace std;
int f[100000];
int main()
{
int v,a[20006],n,m,i,j;
cin>>m>>n;
for(i=1;i<=n;++i)
{
cin>>a[i];
}
f[0]=1;
for(i=1;i<=n;++i)
{
for(j=m;j>=a[i];--j)
{
f[j]=f[j]||f[j-a[i]];//凑,看从j从m开始,递减的值是否能够凑出,这个现在的f[j]要用到前面的值,如果可以凑出,则看下一步
}
}
for(i=m;i>=0;--i)//从最大值开始遍历,如果可凑出输出并结束循环
{
if(f[i])
{
cout<<m-i;
return 0;
}
}
return 0;
}
1.1
有一批集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
其中xi∈{0,1},1≤i≤n。
#include<bits/stdc++.h>
using namespace std;
struct marry
{
int w;
int index;
}s[10000];//定义结构体
bool cmp(marry a,marry b)
{
return a.w<b.w;//升序排列
}
int k[10000]={0};
int main()
{
int m,n,i;
cin>>m>>n;
for(i=1;i<=n;++i)
{
cin>>s[i].w;
s[i].index=i;
}
stable_sort(s+1,s+n+1,cmp);
if(s[1].w>m)
{
cout<<"impossible";
return 0;
}
for(i=1;i<=n&&m>=s[i].w;++i)//按质量大小开始装入
{
m-=s[i].w;
k[s[i].index]=1;//标记符合的编号
}
cout<<i-1<<endl;
for(i=1;i<=n;++i)
{
if(k[i])
cout<<i<<" ";
}
return 0;
}